卡在从vue2升级到vue3

问题描述 投票:0回答:1
// import Vue from "vue"; // vue2
import { createApp } from 'vue' // vue3
import fabComponent from "./components/Fab.vue";
import SvgIcon from "./components/SvgIcon.vue";

// The body of class
window.fab = {   
    mount(options) {

        var html = '<div data-vue-component="FabComponent"></div>';
        document.body.insertAdjacentHTML('beforeend', html);

        document
            .querySelectorAll("[data-vue-component=FabComponent]")
            .forEach((element) => {

                // works in vue2
                // const floatingButton = new Vue(fabComponent)
                // floatingButton.options(options);
                // floatingButton.$mount(element);

                // what is the equivalent in vue3?
                const app = createApp({});
                app.component('fb',fabComponent);
                const floatingButton = app.use(fabComponent);
                floatingButton.options(options);
                floatingButton.$mount(element);
            });
    }
}

我不太精通 vue,但需要将我的 vue2 小部件(即它可以通过仅包含捆绑的 javascript 加载到任何 HTML 中)升级到 vue3 小部件。

我花了两天的时间来翻译这个,并尝试了几乎所有我能想到的方法来翻译这个

new Vue(fabComponent)

Webpack 构建/转换没有错误,但当我尝试在浏览器中加载它时,问题就出现了。在vue2中,

floatingButton
被指定为
Proxy(Object)
,但我似乎无法在vue3中复制它,
floatingButton
Object
。结果,
floatingButton.options(options);
抛出一个未捕获的错误。

我可以在 vue3 中按原样使用

new Vue(fabComponent)
,但是我如何获得我的
app
呢?因为
Fab.vue
依赖于另一个
SvgIcon.vue
组件。

有什么想法吗?谢谢你。

vuejs2 vuejs3
1个回答
0
投票

升级到Vue3,可以创建多个Vue-app实例。相反,在 Vue2 中,它仅限于一个全局实例

另一个重大更改是应用程序实例如何绑定到元素(有一个

mount
函数而不是
$mount
)。

要解决您的问题,您可以为查询返回的每个元素创建一个带有

FabComponent
的应用程序实例。

import { createApp } from 'vue';
import FabComponent from './FabComponent.vue';
import SvgIcon from './SvgIcon.vue';

window.fab = {
  mount(options) {
    var html = '<div data-vue-component="FabComponent">';
    document.body.insertAdjacentHTML('beforeend', html);

    document
      .querySelectorAll('[data-vue-component=FabComponent]')
      .forEach(element => {
         createApp(FabComponent, options)
         .mount(element);
      });
  },
};

window.fab.mount({
  modelValue:'A GLOBAL PROP'
});

网上游乐场

© www.soinside.com 2019 - 2024. All rights reserved.