J'utilise Vue depuis un certain temps, et mon expérience a toujours été une méthode qui recalculera si ses données réactives sous-jacentes sont mises à jour. J'ai rencontré des informations contradictoires sur SO:
- J'essayais de répondre à cette question et on m'a dit à plusieurs reprises que ce n'était pas le cas.
- La réponse acceptée ici indique que "[une méthode] ne sera évaluée que si vous l'appelez explicitement."
J'ai cherché dans les documents et je n'ai rien vu d'incroyablement clair.
S'ils ne sont pas réactifs, pourquoi cet exemple fonctionne-t-il?
<ul>
<li v-for="animal in animals" :key="animal.id">
<span v-if="isAwesome(animal)">{{ animal.name }}</span>
</li>
</ul>
export default {
data() {
return {
awesomeAnimalIds: [],
animals: [
{ id: 1, name: 'dog' },
{ id: 5, name: 'cat' },
{ id: 9, name: 'fish' },
],
};
},
created() {
setTimeout(() => {
this.awesomeAnimalIds.push(5);
}, 1000);
setTimeout(() => {
this.awesomeAnimalIds.push(9);
}, 2000);
},
methods: {
isAwesome(animal) {
return this.awesomeAnimalIds.includes(animal.id);
},
},
};
J'aimerais vraiment avoir une réponse définitive et satisfaisante à laquelle cette communauté puisse se référer.
Réponses:
En fonction de la façon dont les modifications sont suivies à partir des documents, voici ce qui se passe:
Un observateur spécial est créé pour l'instance de composant afin de déterminer quand un nouveau rendu est requis.
Vue convertit toutes les propriétés de
data
en getters et setters.isAwesome
est effectué à partir du modèle.isAwesome
, le getter forawesomeAnimalIds
est invoqué.awesomeAnimalIds
domaine dedata
.awesomeAnimalIds
est mis à jour, ce qui appelle leawesomeAnimalIds
setter.data
champ qui a reçu une notification, un nouveau rendu est déclenché.De ceci et de cet exemple ci-dessus, nous pouvons conclure ce qui suit:
Il existe une idée fausse courante selon laquelle les méthodes ne sont "invoquées qu'une seule fois" ou "tirent et oublient" lorsqu'elles sont appelées à partir d'un modèle. Ce n'est clairement pas toujours le cas car les méthodes peuvent établir une dépendance réactive .
Alors, quand devrions-nous utiliser une propriété calculée par rapport à une méthode?
Consultez la section du guide sur la mise en cache calculée et les méthodes . Voici mon point de vue:
fetch
d'eux.la source
Non, les méthodes ne sont pas réactives. Seules les données peuvent être réactives dans Vue.
MAIS c'est important de comprendre comment fonctionne Vue ...
data()
membres (il le fait tout le temps, pas seulement pendant le premier rendu). Si l'une des données est accessible pendant le rendu, Vue sait que le contenu de ce membre de données influence le résultat du rendu.Peu importe si vous référencez directement le membre de données, utilisez-le dans
computed
ou dans unmethod
. Si les données sont "touchées" pendant le rendu, le changement des données déclenchera un nouveau rendu à l'avenir ...la source
C'est un cas très intéressant.
D'après ce que j'ai lu et mon expérience, je peux dire que: Non, les méthodes ne sont pas intrinsèquement réactives. Une méthode doit être explicitement appelée pour qu'elle s'exécute.
Mais alors, comment puis-je expliquer votre cas? J'ai mis votre code dans un bac à sable et bien sûr, lorsque vous poussez les identifiants dans le tableau, le modèle se met à jour pour afficher le nom de l'animal. Cela indiquerait une certaine réactivité. Ce qui donne?
Eh bien, j'ai mené une expérience. J'ai ajouté un simple
div
à chaque boucle qui génère un nombre aléatoire lors de sa génération.Et ce que j'ai vu, c'est qu'à chaque fois qu'un nouvel identifiant est inséré dans le tableau, tous les nombres aléatoires changent. C'est la clé pour comprendre pourquoi il «semble» que la méthode
isAwesome
est réactive.D'une manière ou d'une autre, lorsqu'un nouvel ID est poussé vers le tableau, Vue restitue entièrement la boucle, exécutant ainsi à nouveau les méthodes. Je ne peux pas expliquer le fonctionnement interne de la raison pour laquelle la vue restitue la boucle entière, ce qui nécessiterait des recherches supplémentaires.
Donc, pour répondre à votre question.
isAwesome
n'est pas réactif, c'est simplement une illusion créée par le re-rendu de la boucle.la source
update
ce qui provoque unre-render
et déclenche toutes les méthodes liées dans le modèle