Ich benutze Vue schon eine Weile und meine Erfahrung war immer, dass eine Methode neu berechnet wird, wenn die zugrunde liegenden reaktiven Daten aktualisiert werden. Ich habe widersprüchliche Informationen zu SO gefunden:
- Ich habe versucht, diese Frage zu beantworten , und mir wurde mehrmals gesagt, dass dies nicht der Fall ist.
- Die akzeptierte Antwort hier zeigt an, dass „[ein Verfahren] wird nur ausgewertet werden , wenn Sie es explizit nennen.“
Ich habe die Dokumente durchsucht und nichts unglaublich klares gesehen.
Wenn sie nicht reaktiv sind, warum funktioniert dieses Beispiel dann?
<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);
},
},
};
Ich hätte wirklich gerne eine endgültige und zufriedenstellende Antwort, auf die sich diese Community beziehen kann.
Antworten:
Basierend auf der Art und Weise, wie Änderungen aus den Dokumenten verfolgt werden, ist Folgendes zu tun:
Für die Komponenteninstanz wird ein spezieller Watcher erstellt, um zu bestimmen, wann ein erneutes Rendern erforderlich ist.
Vue konvertiert alle Eigenschaften von
data
in Getter und Setter.isAwesome
wird aus der Vorlage getätigt.isAwesome
wird der Getter fürawesomeAnimalIds
aufgerufen.awesomeAnimalIds
Feld von herdata
.awesomeAnimalIds
wird aktualisiert, wodurch die aufgerufen wirdawesomeAnimalIds
Setter aufgerufen wird.data
Feld , das eine Benachrichtigung erhalten hat, wird ein erneutes Rendern ausgelöst.Aus diesem und diesem obigen Beispiel können wir Folgendes schließen:
Es gibt ein weit verbreitetes Missverständnis, dass Methoden "nur einmal aufgerufen" oder "ausgelöst und vergessen" werden, wenn sie aus einer Vorlage aufgerufen werden. Dies ist eindeutig nicht immer der Fall, da Methoden eine reaktive Abhängigkeit herstellen können .
Wann sollten wir also eine berechnete Eigenschaft gegenüber einer Methode verwenden?
Weitere Informationen finden Sie im Leitfaden zu Computed Caching vs Methods . Hier ist meine Meinung dazu:
fetch
von ihnen anrufen .quelle
Nein, Methoden sind nicht reaktiv. In Vue können nur Daten reaktiv sein.
ABER es ist wichtig zu verstehen, wie Vue funktioniert ...
data()
Mitglieder (dies geschieht ständig, nicht nur beim ersten Rendern). Wenn während des Renderns auf Daten zugegriffen wird, weiß Vue, dass der Inhalt dieses Datenelements das Ergebnis des Renderns beeinflusst.Es spielt keine Rolle, ob Sie das Datenelement direkt referenzieren, es in
computed
oder in einem verwendenmethod
. Wenn die Daten während des Renderns "berührt" werden, wird die Änderung der Daten in Zukunft ein erneutes Rendern auslösen ...quelle
Dies ist ein sehr interessanter Fall.
Nach dem, was ich gelesen habe und meiner Erfahrung kann ich sagen: Nein, Methoden sind nicht von Natur aus reaktiv. Eine Methode muss explizit aufgerufen werden, damit sie ausgeführt werden kann.
Aber wie kann ich dann Ihren Fall erklären? Ich habe Ihren Code in eine Sandbox eingegeben und sicher genug, wenn Sie IDs in das Array schieben, wird die Vorlage aktualisiert, um den Tiernamen anzuzeigen. Dies würde auf eine gewisse Reaktivität hinweisen. Was gibt?
Nun, ich habe ein Experiment durchgeführt. Ich
div
habe jeder Schleife eine einfache hinzugefügt , die beim Generieren eine Zufallszahl generiert.Und was ich sah, war, dass sich jedes Mal, wenn eine neue ID in das Array verschoben wurde, alle Zufallszahlen änderten. Dies ist der Schlüssel, um zu verstehen, warum es "scheint", als ob die Methode
isAwesome
reaktiv ist.Wenn eine neue ID in das Array verschoben wird, rendert Vue die Schleife irgendwie vollständig neu und führt die Methoden erneut aus. Ich kann das Innenleben nicht erklären, warum Vue die gesamte Schleife neu rendert, was weitere Forschung erfordern würde.
Also, um deine Frage zu beantworten.
isAwesome
ist nicht reaktiv, es ist lediglich eine Illusion, die durch das erneute Rendern der Schleife erzeugt wird.quelle
update
wird einre-render
Trigger