Obtenez une composition et une réactivité améliorées avec Vue.js 3.
P粉935883292
2023-08-03 15:58:35
<p>Étant donné les « useNumbers.js » combinés suivants dans Vue.js 3, je souhaite que les « numéros » du composant soient réactifs. Cependant, l'ajout d'une nouvelle valeur aux « nombres » dans un composant ne sera pas reflété dans le deuxième composant. <br /><br />useNumbers.js:</p><p><br /></p>
<pre class="brush:php;toolbar:false;">importer { ref } depuis 'vue';
exporter la fonction par défaut() {
nombres const = ref([1, 2, 3, 4, 5]);
const addNumber = num =>
nombres.value.push(num);
}
const filterNumber = minNum =>
return number.value.filter(curNum => curNum >= minNum);
}
retourner { nombres, addNumber, filterNumber }
}</pré>
<p>Composant A :</p>
<pre class="brush:php;toolbar:false;"><template>
<div>
<h1>Composant enfant</h1>
<p>{{ chiffres }}</p>
<bouton @click="addNumber(45)">Ajouter 45</bouton>
<div class="line"></div>
<Petit-Enfant />
</div>
</modèle>
<configuration du script>
importer des useNumbers depuis '../composables/useNumbers' ;
importer GrandChild depuis './GrandChild.vue' ;
const { nombres, addNumber } = useNumbers()
</script></pre>
<p>Composant B :</p>
<pre class="brush:php;toolbar:false;"><template>
<div>
<h1>Composant GreatGrandChild</h1>
<p>{{ chiffres }}</p>
<div class="line"></div>
</div>
</modèle>
<configuration du script>
importer des useNumbers depuis '../composables/useNumbers' ;
const { nombres } = useNumbers();
</script></pre>
<p> Chaque fois que je clique sur le bouton dans le composant A (en ajoutant 45 au tableau), ce changement n'est pas reflété dans le composant B. Je sais que des opérations comme la déstructuration des affectations entraînent une perte de réactivité. </p>
<pre class="brush:php;toolbar:false;">const { nombres, addNumber } = useNumbers()</pre>
<p>Réactivité cassée. J'ai essayé quelques choses en utilisant toRef et toRefs mais je n'ai pas encore trouvé de solution. </p>
La raison principale de votre problème est que chaque fois que la fonction useNumbers est appelée, une nouvelle instance de l'objet Numbers est créée. Par conséquent, chaque composant possède sa propre copie de nombres, qui ne sont pas partagées entre les composants.
Utiliser le magasin
Pour conserver le même état sur plusieurs instances useNumbers, vous pouvez hisser l'état en dehors de la fonction afin qu'il ne soit créé qu'une seule fois.
Exemple de Vue Playground