最佳實務:Vue 3 中將元件附加到 DOM 的方法
P粉362071992
2023-08-24 19:51:03
<p>我想在我的Vue 3應用程式中動態建立一個元件,該元件在單一檔案元件(SFC)中,並將其附加到DOM。我正在使用<code><script setup></code>風格的組件,這是另一個問題。 </p>
<p>這似乎是不必要的困難。 </p>
<p>以下大致是我想做的事:</p>
<ol>
<li>取得一些數據。已經完成。 </li>
<li>建立一個Vue元件的實例:Foo.vue。 </li>
<li>將資料作為屬性傳遞給它。 </li>
<li>將它附加到我想要的位置。 </li>
</ol>
<p>問題是,我不能在模板中使用<component :is="Foo:>,因為在模板渲染之後很久之後,我不知道它將在哪裡。</p>
<p>有沒有最佳實務?有沒有善心人士可以提供一個簡單的例子,我會非常感激。 </p>
<p>我有時無法理解Vue文檔的一半時間。抱歉,不想這麼說,但對於Vue的新手來說,它們相當晦澀,讓我感到很愚蠢。 </p>
<p>以下是一些假程式碼,說明我想做的事情:</p>
<pre class="brush:php;toolbar:false;">import Foo from "../components/Foo.vue"
function makeAFoo(p, data){
// 實例化我的Foo.vue(不確定如何在內聯中實作),並將其傳遞所需的數據
let foo = new Foo(data); // 如果只有這麼簡單,對吧?
// 將其附加到p(這是一個HTML元素)
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
範例用法