我想在我的Vue 3應用程式中動態建立一個元件,該元件在單一檔案元件(SFC)中,並將其附加到DOM。我正在使用
風格的組件,這是另一個問題。
這似乎是不必要的困難。
以下大致是我想做的事:
- 取得一些數據。已經完成。
- 建立一個Vue元件的實例:Foo.vue。
- 將資料作為屬性傳遞給它。
- 將它附加到我想要的位置。
問題是,我不能在模板中使用import Foo from "../components/Foo.vue" function makeAFoo(p, data){ // 實例化我的Foo.vue(不確定如何在內聯中實作),並將其傳遞所需的數據 let foo = new Foo(data); // 如果只有這麼簡單,對吧? // 將其附加到p(這是一個HTML元素) p.appendChild(foo) }
更簡單的方法是使用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
範例用法