J'ai créé le composant fonctionnel suivant en utilisant la méthode de rendu:
<template> <div id="app"> <HelloWorld /> </div> </template> <script> export default { data() { return { compiled: false } } } </script> <style> </style>
Et puis dans App.vue
:
import Vue from "vue" const { render, staticRenderFns } = Vue.compile(`<div>Hello World</div>`) Vue.component("HelloWorld", { functional: true, render, staticRenderFns })
Et j'obtiens l'erreur:
_c n'est pas défini
.
Est-ce que je fais quelque chose de mal ici?
3 Réponses :
Pour autant que je sache, les fonctions de rendu générées par Vue.compile
ne peuvent pas être utilisées pour rendre un composant fonctionnel.
Oh merde! C'est une déception. Existe-t-il un moyen de créer un composant fonctionnel en passant une chaîne de modèle?
Je ne pense pas. Le compilateur de modèles fourni avec Vue n'est pas capable de compiler des modèles fonctionnels. Je pense que seul le compilateur fourni avec vue-loader
peut le faire au moment de la construction.
Puis-je vous demander pourquoi vous avez besoin d'utiliser Vue.compile
? Il existe peut-être une meilleure solution à votre problème.
En fait, je récupère le code HTML du serveur et le rend comme un composant Vue.
Est-ce que vous récupérez du HTML brut ou est-ce un modèle Vue? Si c'est du HTML purifié, vous pouvez simplement utiliser v-html
pour le rendre.
Le HTML est nettoyé. L'utilisateur est autorisé à créer lui-même des composants dynamiques. Ils définissent id et html et je les utilise pour cuire un composant et donc l'utilisateur peut écrire
Je pense que la chose la plus proche de la création d'un composant fonctionnel à partir d'une chaîne de modèle impliquerait d'analyser la chaîne pour obtenir le type d'élément et les attributs et le rendre comme:
Vue.component("hello-world", { functional: true, render: function(createElement, context) { return createElement( "div", 'example text' ); } });
Comme Decade Moon l'a déjà mentionné, les fonctions de rendu renvoyées par Vue.compile
ne peuvent pas être utilisées comme fonction de rendu dans un composant fonctionnel . La raison pour cela devient claire lorsque vous inspectez la signature de la fonction retournée par Vue.compile
:
// component.vue <template functional> <div>Hello World</div> </template> <script> export default { name: "hello" }; </script>
Comme vous pouvez le voir, il manque un deuxième argument à la fonction, qui est requis pour les fonctions de rendu des composants fonctionnels:
render: (createElement: CreateElement, context: RenderContext<Record<never, any>>) => VNode
Les composants fonctionnels sont sans instance. Cela signifie qu'il n'y a pas de ce
contexte - c'est pourquoi un paramètre context
supplémentaire est nécessaire pour transporter des accessoires \ des écouteurs, etc.
Aussi si vous regardez ce message sur le forum Vue : p >
La fonction de rendu créée par compile () repose sur les propriétés privées du composant. Pour avoir accès à ces propriétés, la méthode doit être affectée à une propriété du composant (elle a donc accès à ces propriétés via
this
)
Cependant, cela ne signifie pas que vous ne pouvez pas créer de composant fonctionnel avec un modèle. Vous pouvez, vous n'êtes tout simplement pas en mesure d'utiliser Vue.compile
pour passer le texte du modèle de manière dynamique. Si vous êtes d'accord avec le modèle statique, vous pouvez le faire comme ceci:
const render: (createElement: any) => VNode
... et utiliser le composant comme n'importe quel autre SFC (composant de fichier unique = fichier VUE)
Si vous avez besoin d'un modèle de texte dynamique, utilisez simplement un composant non fonctionnel à la place ...
Voir ceci - stackoverflow.com/questions/44369839/... vous devez importer votre composant
Importer mon composant? Mais il est déjà déclaré en tant que composant global. Et aussi, ce problème concerne uniquement le composant fonctionnel. Le composant normal fonctionne bien, c'est-à-dire que si je supprime
fonctionnel: true
, cela fonctionne bien.Que diriez-vous de: stackoverflow.com/questions/57901607/…
@webnoob Merde, c'est utile. Merci beaucoup. Bien que pas sûr du composant fonctionnel.