Meilleure pratique : comment attacher des composants au DOM dans Vue 3
P粉362071992
2023-08-24 19:51:03
<p>Je souhaite créer dynamiquement un composant dans mon application Vue 3, à l'intérieur d'un composant de fichier unique (SFC), et l'ajouter au DOM. J'utilise un composant de style <code><script setup></code> </p>
<p>Cela semble inutilement difficile. </p>
<p>Voici à peu près ce que je veux faire :</p>
<ol>
<li>Obtenir des données. A été complété. ≪/li>
<li>Créez une instance du composant Vue : Foo.vue. ≪/li>
<li>Transmettez-lui les données en tant que propriétés. ≪/li>
<li>Ajoutez-le là où je le souhaite. ≪/li>
</ol>
<p>Le problème est que je ne peux pas utiliser <component :is="Foo:> dans le modèle car je ne sais pas où il se trouvera longtemps après le rendu du modèle.</p>
<p>Existe-t-il des bonnes pratiques ? Y a-t-il une personne aimable qui peut fournir un exemple simple, je lui serais très reconnaissant. </p>
<p>Parfois, je n'arrive pas à comprendre la documentation de Vue la moitié du temps. Désolé, je déteste le dire, mais pour un débutant sur Vue, ils sont assez obscurs et me font me sentir stupide. </p>
<p>Voici un faux code pour ce que j'essaie de faire : </p>
<pre class="brush:php;toolbar:false;">importer Foo depuis "../components/Foo.vue"
fonction makeAFoo(p, données){
// Instancier mon Foo.vue (je ne sais pas comment faire cela en ligne) et lui transmettre les données requises
let foo = new Foo(data); // Si seulement c'était aussi simple, non ?
//Ajoutez-le à p (qui est un élément HTML)
p.appendChild(foo)
}</pré>
<p><br /></p>
Un moyen plus simple consiste à utiliser v-if ou v-for.
Au lieu de gérer le composant directement, gérons l'état du composant et laissons la magie de la réactivité de Vue opérer
Ceci est un exemple, ajoutez dynamiquement un composant (Toast), exploitez simplement l'état du composant
Fichier Toast.vue : Le v-for ici est réactif, chaque fois qu'une nouvelle erreur est ajoutée à l'objet erreurs, elle sera rendue
ErrorTrigger.vue : chaque fois qu'un événement de clic se produit, nous transmettons une erreur à l'objet erreurs
Exemple complet : https://stackblitz.com/edit/vitejs-vite-mcjgkl
Option 1 : Utiliser
createVNode(component, props)
和render(vnode, container)
Créer : Utilisez
createVNode()
创建一个带有props的组件定义的VNode
(例如,从*.vue
导入的SFC),可以将其传递给render()
pour effectuer le rendu sur l'élément conteneur donné.Destroy : Appelez le
render(null, container)
会销毁附加到容器的VNode
。当父组件卸载时(通过unmounted
hook du cycle de vie) Cette méthode doit être appelée pour le nettoyage.Remarque : Cette méthode repose sur des méthodes internes (
createVNode
和render
) qui peuvent être refactorisées ou supprimées dans les versions futures.Démo 1
Option 2 : Utiliser
createApp(component, props)
和app.mount(container)
Créer : Créez un
qui peut être used Rend le composant sur l'élément conteneur donné.createApp()
createApp()
创建一个应用实例。该实例具有mount()
="noreferrer">Exemples d'application . Cette instance a une méthodemount()
Destruction : Les instances d'application ont la méthode
pour détruire les instances d'application et de composant. Cette méthode doit être appelée pour nettoyer lorsque le composant parent est démonté (via le hook de cycle de vieunmount()
方法来销毁应用和组件实例。当父组件卸载时(通过unmounted
unmount()
unmount
).Démo 2