无法安装两次相同的 Vue 3 组件
Cannont mount twice the same Vue 3 component
我在框架加载期间将 Vue 3 组件安装为加载动画:
createApp(App).mount(e);
加载框架时,框架内容会在 html 中删除组件(但我猜不是 Vue)。此行为由 Vue 的外部系统管理。
当我尝试使用同一命令重新加载组件时,组件未显示。
如果我只重新挂载该组件,我会在控制台中看到以下警告并且该组件不会显示:
"[Vue warn]: App has already been mounted.
If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. `const createMyApp = () => createApp(App)`".
我还找到了一种方法来复制问题:
const app = createApp(App)
app.mount(el);
el.innerHtml = '';
app.mount(el);
我也尝试卸载组件但没有成功:
const app = createApp(App);
app.mount(el);
app.unmount();
app.mount(el);
那么在外部擦除同一个vue组件时,正确的显示方式是什么?
要mount/unmount2个Vue实例,需要使用render方法
因此,例如下面的示例,此解决方案有效:
var app = createApp({ render: () => h(App) })
app.mount(el);
el.innerHtml = '';
app = createApp({ render: () => h(App) })
app.mount(el);
不要忘记导入 h() 函数:
import { createApp, h } from 'vue';
更好的选择是使用 Vue custom elements。
首先,创建一个扩展名为 ce.vue 的经典 SFC :
//test.ce.vue
<template>
<div class="text-primary">Test</div>
</template>
<script>
export default {
name: 'test',
};
</script>
<style>
.text-primary {
color: red;
}
</style>
然后在主脚本中:
//app.js
import Test from 'test.ce.vue';
const testElement = defineCustomElement(Test);
customElements.define('test-element', testElement);
document.body.appendChild(document.createElement('test-element'));
一旦在文档中检测到该组件,就会立即呈现该组件:
<test-component>
#shadow-root (open)
<style>
.text-primary {
color: red;
}
</style>
<div class="text-primary">Test</div>
</test-component>
我在框架加载期间将 Vue 3 组件安装为加载动画:
createApp(App).mount(e);
加载框架时,框架内容会在 html 中删除组件(但我猜不是 Vue)。此行为由 Vue 的外部系统管理。
当我尝试使用同一命令重新加载组件时,组件未显示。
如果我只重新挂载该组件,我会在控制台中看到以下警告并且该组件不会显示:
"[Vue warn]: App has already been mounted.
If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. `const createMyApp = () => createApp(App)`".
我还找到了一种方法来复制问题:
const app = createApp(App)
app.mount(el);
el.innerHtml = '';
app.mount(el);
我也尝试卸载组件但没有成功:
const app = createApp(App);
app.mount(el);
app.unmount();
app.mount(el);
那么在外部擦除同一个vue组件时,正确的显示方式是什么?
要mount/unmount2个Vue实例,需要使用render方法
因此,例如下面的示例,此解决方案有效:
var app = createApp({ render: () => h(App) })
app.mount(el);
el.innerHtml = '';
app = createApp({ render: () => h(App) })
app.mount(el);
不要忘记导入 h() 函数:
import { createApp, h } from 'vue';
更好的选择是使用 Vue custom elements。
首先,创建一个扩展名为 ce.vue 的经典 SFC :
//test.ce.vue
<template>
<div class="text-primary">Test</div>
</template>
<script>
export default {
name: 'test',
};
</script>
<style>
.text-primary {
color: red;
}
</style>
然后在主脚本中:
//app.js
import Test from 'test.ce.vue';
const testElement = defineCustomElement(Test);
customElements.define('test-element', testElement);
document.body.appendChild(document.createElement('test-element'));
一旦在文档中检测到该组件,就会立即呈现该组件:
<test-component>
#shadow-root (open)
<style>
.text-primary {
color: red;
}
</style>
<div class="text-primary">Test</div>
</test-component>