Best Practice: So hängen Sie Komponenten an das DOM in Vue 3 an
P粉362071992
2023-08-24 19:51:03
<p>Ich möchte in meiner Vue 3-Anwendung dynamisch eine Komponente innerhalb einer Single File Component (SFC) erstellen und sie an das DOM anhängen. Ich verwende eine Komponente im <code><script setup></code> und das ist ein weiteres Problem. </p>
<p>Das erscheint unnötig schwierig. </p>
<p>Hier ist ungefähr, was ich tun möchte:</p>
<ol>
<li>Besorgen Sie sich einige Daten. Wurde vervollständigt. </li>
<li>Erstellen Sie eine Instanz der Vue-Komponente: Foo.vue. </li>
<li>Daten als Eigenschaften übergeben. </li>
<li>Hänge es dort an, wo ich es haben möchte. </li>
</ol>
<p>Das Problem ist, dass ich <component :is="Foo:> nicht in der Vorlage verwenden kann, weil ich lange nach dem Rendern der Vorlage nicht weiß, wo es sein wird.</p>
<p>Gibt es Best Practices? Gibt es eine nette Person, die ein einfaches Beispiel liefern kann? Ich wäre sehr dankbar. </p>
<p>Manchmal kann ich die Vue-Dokumentation die Hälfte der Zeit nicht verstehen. Tut mir leid, ich sage es nur ungern, aber für einen Vue-Neuling sind sie ziemlich undurchsichtig und ich komme mir dumm vor. </p>
<p>Hier ist ein gefälschter Code für das, was ich versuche: </p>
<pre class="brush:php;toolbar:false;">Foo importieren aus "../components/Foo.vue"
Funktion makeAFoo(p, data){
// Instanziiere mein Foo.vue (ich bin mir nicht sicher, wie das inline geht) und übergebe ihm die erforderlichen Daten
let foo = new Foo(data); // Wenn es nur so einfach wäre, oder?
//Hänge es an p an (das ein HTML-Element ist)
p.appendChild(foo)
}</pre>
<p><br /></p>
更简单的方法是使用v-if或v-for。
与其直接处理组件,不如处理组件的状态,让Vue的响应性魔法发挥作用
这是一个示例,动态添加一个组件(Toast),只需操作组件的状态
Toast.vue文件:这里的v-for是响应式的,每当向errors对象添加新的错误时,它将被渲染
ErrorTrigger.vue:每当发生点击事件时,我们向errors对象推送一个错误
完整示例: https://stackblitz.com/edit/vitejs-vite-mcjgkl
选项1:使用
createVNode(component, props)
和render(vnode, container)
创建:使用
createVNode()
创建一个带有props的组件定义的VNode
(例如,从*.vue
导入的SFC),可以将其传递给render()
在给定的容器元素上渲染。销毁:调用
render(null, container)
会销毁附加到容器的VNode
。当父组件卸载时(通过unmounted
生命周期钩子)应该调用此方法进行清理。注意:此方法依赖于内部方法(
createVNode
和render
),这些方法在将来的版本中可能会进行重构或删除。演示1
选项2:使用
createApp(component, props)
和app.mount(container)
创建:使用
createApp()
创建一个应用实例。该实例具有mount()
方法,可以用于在给定的容器元素上渲染组件。销毁:应用实例具有
unmount()
方法来销毁应用和组件实例。当父组件卸载时(通过unmounted
生命周期钩子)应该调用此方法进行清理。注意:此方法为每个组件创建一个应用实例,如果需要在文档中同时实例化多个组件,可能会产生不小的开销。
演示2
示例用法