Bei der Verwendung von Vue zum Entwickeln von Projekten stoßen Sie häufig auf dieses Problem: Wenn in den Daten von Vue ein Objekt oder Array (der Wert im Array ist ein Objekt) deklariert oder zugewiesen wird und dem Objekt ein neues Attribut hinzugefügt wird, wird die Ansicht nicht aktualisiert, wenn der Wert dieses Attributs aktualisiert wird. Dies liegt daran, dass die neu hinzugefügten Attribute nicht reagieren und daher keine Ansichtsaktualisierung auslösen. Normalerweise wird zur Lösung dieses Problems die statische Methode Vue.set() oder die Instanzmethode this.$set() verwendet. Verwendung: Objekt: this.$set(Ziel, Schlüssel, Wert) Array: dies.$set(Ziel, Index, Wert) Unabhängig davon, ob es sich um die statische Methode Vue.set() oder die Instanzmethode this.$set() handelt, ist die zugrunde liegende Implementierungslogik dieselbe. Die Implementierungslogik lautet wie folgt: /** * Eine Eigenschaft für ein Objekt festlegen. Fügt die neue Eigenschaft hinzu und * löst eine Änderungsbenachrichtigung aus, wenn die Eigenschaft nicht * existiert bereits. */ Exportfunktionssatz (Ziel: Array<beliebig> | Objekt, Schlüssel: beliebig, Wert: beliebig): beliebig { // Bestimmen Sie zunächst, ob das übergebene Zielobjekt undefiniert, null oder primitiv (ursprünglicher Wert) ist, oder geben Sie eine Warnung aus, wenn (process.env.NODE_ENV !== 'production' && (istUndef(Ziel) || istPrimitive(Ziel)) ) { warnen(`Reaktive Eigenschaft kann nicht auf undefinierten, Null- oder primitiven Wert gesetzt werden: ${(target: any)}`) } // Überprüfen Sie, ob das Zielobjekt target ein Array und key ein gültiger Index ist, if (Array.isArray(target) && isValidArrayIndex(key)) { // Nimm den größeren Wert der Länge und des Schlüssels des Zielarrays als Längenattribut des Ziels target.length = Math.max(target.length, key) //Ersetze das Element an der Schlüsselposition durch splice target.splice(key, 1, val) Rückgabewert } // Wenn der Schlüssel bereits im Zielobjekt vorhanden ist, weisen Sie ihn direkt zu, wenn (Schlüssel in Ziel && !(Schlüssel in Object.prototype)) { Ziel[Schlüssel] = Wert Rückgabewert } // Holen Sie sich das Beobachterobjekt im Ziel const ob = (target: any).__ob__ // Wenn das Ziel eine Vue-Instanz ist oder $data direkt zurückgegeben wird, wenn (target._isVue || (ob && ob.vmCount)) { process.env.NODE_ENV !== 'Produktion' && warn( 'Vermeiden Sie das Hinzufügen reaktiver Eigenschaften zu einer Vue-Instanz oder ihren Stamm-$data' + „Zur Laufzeit – deklarieren Sie es im Voraus in der Datenoption.“ ) Rückgabewert } // Wenn ob nicht existiert, bedeutet dies, dass das Ziel kein responsives Objekt ist und der Wert direkt zugewiesen wird, ohne eine Ansichtsaktualisierung auszulösen, wenn (!ob) { Ziel[Schlüssel] = Wert Rückgabewert } // Wenn ob existiert, setze key als responsive Eigenschaft defineReactive(ob.value, key, val) // Benachrichtigung senden, um Ansichtsaktualisierung auszulösen ob.dep.notify() Rückgabewert } Das Obige ist der Quellcode der Set-Methode in Vue. Hierbei ist zu beachten, dass bei der Verarbeitung eines Arrays die verwendete Splice-Methode nicht die Methode des Arrays selbst ist, sondern eine in Vue gekapselte responsive Array-Methode. Dies ist das Ende dieses Artikels über den detaillierten Quellcode der Vue-Methode vue.$set(). Weitere relevante Inhalte zum Quellcode der Vue-Methode vue.$set() finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: Studiennotizen zur MySQL Master-Slave-Konfiguration
Inhaltsverzeichnis 1. Projektbeschreibung 1.1 Hin...
Der detaillierte Prozess zum Konfigurieren des My...
1. Einleitung Wenn die Datenmenge in der Datenban...
1. Installationsanweisungen Im Vergleich zur loka...
Inhaltsverzeichnis 1. v-Text (v-Befehlsname = „Va...
Ein weiterer wichtiger Aspekt bei der Trennung vo...
Inhaltsverzeichnis Funktionale Komponenten So sch...
(1) Einleitung: clipboard.js ist ein leichtes Jav...
Schauen wir uns zunächst einen CSS-Karussell-Anim...
Was ist das? Spring Boot ist ein Unterprojekt der...
Nachdem ich das letzte Mal die Taobao-Detailseite ...
Verstehen von object.defineProperty, um Reaktions...
Effektive Lösung für Ubuntu, wenn in einer virtue...
Anzeigedefinitions-ID Wenn die in der Tabelle def...
Wenn Sie ein Webprojekt entwickeln, müssen Sie II...