Amalan Terbaik: Cara melampirkan komponen pada DOM dalam Vue 3
P粉362071992
2023-08-24 19:51:03
<p>Saya mahu mencipta komponen secara dinamik dalam aplikasi Vue 3 saya, di dalam Komponen Fail Tunggal (SFC) dan menambahkannya pada DOM. Saya menggunakan <kod><persediaan skrip></code> dan itu satu lagi masalah. </p>
<p>Ini nampaknya tidak semestinya sukar. </p>
<p>Ini kira-kira perkara yang saya mahu lakukan:</p>
<ol>
<li>Dapatkan beberapa data. Telah selesai. </li>
<li>Buat contoh komponen Vue: Foo.vue. </li>
<li>Haruskan data kepadanya sebagai sifat. </li>
<li>Tambahkannya di tempat yang saya mahukan. </li>
</ol>
<p>Masalahnya ialah, saya tidak boleh menggunakan <komponen :is="Foo:> dalam templat kerana saya tidak tahu di mana ia akan lama selepas templat dipaparkan.</p>
<p>Adakah terdapat sebarang amalan terbaik? Adakah ada orang baik yang boleh memberikan contoh yang mudah, saya akan sangat berterima kasih. </p>
<p>Saya kadangkala tidak dapat memahami dokumentasi Vue separuh masa. Maaf, benci untuk mengatakannya, tetapi untuk pemula Vue, mereka agak kabur dan membuatkan saya berasa bodoh. </p>
<p>Berikut ialah beberapa kod palsu untuk perkara yang saya cuba lakukan: </p>
<pre class="brush:php;toolbar:false;">import Foo daripada "../components/Foo.vue"
fungsi makeAFoo(p, data){
// Instantiate Foo.vue saya (tidak pasti cara melakukan inline ini) dan hantarkan data yang diperlukan
let foo = new Foo(data); // Jika semudah itu, bukan?
//Tambahkannya pada p (iaitu elemen HTML)
p.appendChild(foo)
}</pre>
<p><br /></p>
Cara yang lebih mudah ialah menggunakan v-if atau v-for.
Daripada mengendalikan komponen secara langsung, mari kita kendalikan keadaan komponen dan biarkan sihir responsif Vue berfungsi
Ini adalah contoh, tambah komponen secara dinamik (Toast), cuma kendalikan keadaan komponen
Toast.vue file: V-for di sini adalah reaktif, apabila ralat baharu ditambahkan pada objek ralat, ia akan dipaparkan
ErrorTrigger.vue: Setiap kali peristiwa klik berlaku, kami menolak ralat ke objek ralat
Contoh penuh: https://stackblitz.com/edit/vitejs-vite-mcjgkl
Pilihan 1: Gunakan
createVNode(component, props)
和render(vnode, container)
Buat: Gunakan
createVNode()
创建一个带有props的组件定义的VNode
(例如,从*.vue
导入的SFC),可以将其传递给render()
untuk membuat pada elemen bekas yang diberikan.Hancurkan: Panggil cangkuk
render(null, container)
会销毁附加到容器的VNode
。当父组件卸载时(通过unmounted
kitaran hayat) Kaedah ini harus dipanggil untuk pembersihan.Nota: Kaedah ini bergantung pada kaedah dalaman (
createVNode
和render
) yang mungkin difaktorkan semula atau dikeluarkan dalam keluaran akan datang.Demo 1
Pilihan 2: Gunakan
createApp(component, props)
和app.mount(container)
Buat: Buat
yang boleh digunakan Menjadikan komponen pada elemen bekas yang diberikan.createApp()
createApp()
创建一个应用实例。该实例具有mount()
="noreferrer">Contoh aplikasi . Contoh ini mempunyai kaedahmount()
Pemusnahan: Aplikasi aplikasi mempunyainyahlekap()
kaedah untuk memusnahkan contoh aplikasi dan komponen. Kaedah ini harus dipanggil untuk membersihkan apabila komponen induk dinyahlekapkan (melalui cangkuk kitar hayatunmount()
方法来销毁应用和组件实例。当父组件卸载时(通过unmounted
unmounted
).Demo 2