1. ObjektänderungserkennungAls nächstes simulieren wir die Logik zur Erkennung von Datenänderungen. Lassen Sie mich betonen, was wir tun werden: Die Außenwelt über Datenänderungen benachrichtigen (die Außenwelt führt dann einige ihrer eigenen logischen Verarbeitungsvorgänge durch, beispielsweise das erneute Rendern der Ansicht). Bevor wir mit dem Codieren beginnen, müssen wir zunächst die folgenden Fragen beantworten: 1. Wie erkennt man Veränderungen an Objekten?
2. Wen benachrichtigen wir bei Datenänderungen?
3. Auf wen kann man sich verlassen?
4. Wann werden Sie benachrichtigt?
5. Wann sollen Abhängigkeiten erfasst werden?
6. Wo werden die Daten erhoben?
Der Code lautet wie folgt (kann direkt ausgeführt werden): // Globale Variablen zum Speichern von Abhängigkeiten let globalData = undefined; // Daten in responsive Funktion umwandeln defineReactive (obj, key, val) { // Abhängigkeitsliste let dependList = [] Objekt.defineProperty(Objekt, Schlüssel, { aufzählbar: wahr, konfigurierbar: true, erhalten: Funktion () { // Abhängigkeiten sammeln (Watcher) globalData und dependList.push(globalData) Rückgabewert }, set: Funktion reactiveSetter (newVal) { wenn(Wert === neuerWert){ zurückkehren } // Benachrichtigungsabhängigkeiten (Watcher) dependList.fürJeden(w => { w.update(neuerWert, Wert) }) val = neuerWert } }); } // Hängt von der Klasse Watcher{ ab. Konstruktor(Daten, Schlüssel, Rückruf){ diese.daten = Daten; dieser.Schlüssel = Schlüssel; this.callback = Rückruf; dies.val = dies.get(); } // Dieser Code kann sich selbst zur Abhängigkeitsliste hinzufügen get(){ //Abhängigkeiten in globalData speichern globalData = dies; // Beim Lesen von Daten Abhängigkeiten sammeln let value = this.data[this.key] globalData = undefiniert Rückgabewert; } // Benachrichtigung erhalten, wenn sich Daten ändern, und dann die Außenwelt benachrichtigen update(newVal, oldVal){ this.callback(neuerWert, alterWert) } } /* Das Folgende ist der Testcode */ lass Daten = {}; // Das Namensattribut responsiv machen defineReactive(data, 'age', '88') // Wenn sich das Datenalter ändert, wird der Watcher benachrichtigt, und anschließend benachrichtigt der Watcher die Außenwelt new Watcher(data, 'age', (newVal, oldVal) => { console.log(`Außenwelt: newVal = ${newVal}; oldVal = ${oldVal}`) }) data.age -= 1 // Konsolenausgabe: Extern: newVal = 87; oldVal = 88 Führen Sie die Ausführung Anbei ein Beziehungsdiagramm zwischen Data, defineReactive, dependList, Watcher und der Außenwelt. Konvertieren Sie die Daten zunächst mit der Methode defineReactive() ( Die Außenwelt liest Daten über Watcher ( Wenn die Daten geändert werden ( 2. Fragen zum Objekt Denken Sie darüber nach: Wird im obigen Beispiel die Außenwelt benachrichtigt, wenn Gewohnheit. Weil der Setter nicht ausgelöst wird. Bitte lesen Sie weiter: <!DOCTYPE html> <html lang="de"> <Kopf> <meta charset="UTF-8"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1.0"> <title>Dokument</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </Kopf> <Text> <div id='App'> <Abschnitt> {{ p1.name }} {{ p1.age }} </Abschnitt> </div> <Skript> const app = new Vue({ el: '#app', Daten: { p1: { Name: 'ph', Alter: 18 } } }) </Skript> </body> </html> Nach dem Ausführen wird auf der Seite Um dieses Problem zu lösen, bietet Vue zwei APIs (die später vorgestellt werden): vm.$set und vm.$delete. Wenn Sie mit der Ausführung Hinweis : Wenn hier Array-Änderungserkennung3.1 Hintergrund Wenn Funktion defineReactive(Objekt, Schlüssel, Wert) { Objekt.defineProperty(Objekt, Schlüssel, { aufzählbar: wahr, konfigurierbar: true, erhalten: Funktion () { konsole.log(`get val = ${val}`) Rückgabewert }, set: Funktion reactiveSetter (newVal) { wenn(Wert === neuerWert){ zurückkehren } Konsole.log(`set val = ${newVal}; oldVal = ${val}`) val = neuerWert } }); } // Das Folgende ist der Testcode {1} lass Daten = {} defineReactive(Daten, 'a', [11,22]) data.a.push(33) // get val = 11,22 (Setter nicht ausgelöst) {2} data.a // Wert abrufen = 11,22,33 data.a = 1 // setze Wert = 1; alterWert = 11,22,33 (Setter auslösen) Das Ändern des Wertes des Arrays durch die push()-Methode löst den Setter (Zeile {2}) nicht aus, so dass die Außenwelt nicht benachrichtigt werden kann. Dies scheint ein Problem zu veranschaulichen: Durch die Methode Object.definePropery() können nur Objekte in Reaktionsfähigkeit umgewandelt werden, Arrays jedoch nicht. Tatsächlich kann Object.definePropery() Arrays in reaktionsfähige Arrays umwandeln. Siehe das Beispiel: // Fahren Sie mit dem obigen Beispiel fort und ändern Sie den Testcode (Zeile {1}) wie folgt: lass Daten = [] defineReactive(Daten, '0', 11) Daten[0] = 22 // setze Wert = 22; alterWert = 11 data.push(33) // wird nicht ausgelöst {10} Obwohl Object.definePropery() ein Array reaktionsfähig machen kann, wird die Außenwelt durch eine Modifizierung des Arrays über Daher werden in Vue zwei Methodensätze verwendet, um Daten in Reaktionsfähigkeit umzuwandeln: Objekte verwenden Object.defineProperty(); Arrays verwenden einen anderen Satz. 3.2 UmsetzungIn es6 kann Proxy verwendet werden, um Änderungen in Arrays zu erkennen. Siehe das Beispiel: lass Daten = [11,22] let p = neuer Proxy(Daten, { set: Funktion(Ziel, Eigenschaft, Wert, Empfänger) { Ziel[Eigenschaft] = Wert; console.log('Eigenschaftssatz: ' + Eigenschaft + ' = ' + Wert); gibt true zurück; } }) konsole.log(p) p.drücken(33) /* Ausgabe: [ 11 , 22 ] Eigenschaftssatz: 2 = 33 Eigenschaftssatz: Länge = 3 */ Vor es6 war es etwas problematischer und Sie konnten Interceptors verwenden. Das Prinzip ist: Wenn wir // Array-Prototyp let arrayPrototype = Array.prototype // Einen Interceptor erstellen let interceptor = Object.create(arrayPrototype) // Ordnen Sie den Interceptor den Methoden des ursprünglichen Arrays zu; ('push,pop,unshift,shift,splice,sort,reverse').split(',') .forEach(Methode => { let Herkunft = ArrayPrototyp[Methode]; Objekt.defineProperty(Interceptor, Methode, { Wert: Funktion(...args){ Konsole.log(`Interceptor: args = ${args}`) gib Ursprung zurück.apply(dies, Argumente); }, aufzählbar: falsch, beschreibbar: true, konfigurierbar: true }) }); // Testen Sie let arr1 = ['a'] sei arr2 = [10] arr1.push('b') // Änderungen im Array arr2 erkennen Object.setPrototypeOf(arr2, interceptor) // {20} arr2.push(11) // Abfangjäger: args = 11 arr2.unshift(22) // Abfangjäger: args = 22 Dieses Beispiel fügt dem Interceptor sieben Methoden hinzu, die den Inhalt des Arrays selbst ändern können. Wenn Sie Änderungen an einem Array erkennen müssen, richten Sie den Prototyp des Arrays auf den Interceptor (Zeile {20}). Wenn wir das Array über 7 Methoden wie Push ändern, wird es im Interceptor ausgelöst, sodass die Außenwelt benachrichtigt werden kann. An diesem Punkt haben wir nur die Aufgabe der Erkennung von Array-Änderungen abgeschlossen. Wenn sich Daten ändern, benachrichtigen Sie die Außenwelt. Die obige Kodierungsimplementierung gilt nur für Objektdaten, hier müssen wir sie jedoch für Array-Daten implementieren. Lassen Sie uns über die gleiche Frage nachdenken: 1. Wie erkennt man Änderungen in einem Array?
2. Wen benachrichtigen wir bei Datenänderungen?
3. Auf wen kann man sich verlassen?
4. Wann werden Sie benachrichtigt?
5. Wann sollen Abhängigkeiten erfasst werden?
6. Wo werden die Daten erhoben?
Das ist alles, ich werde hier nicht ins Detail gehen. Im nächsten Artikel werde ich den Quellcode zur Datenerkennung in Vue extrahieren und ihn in Verbindung mit diesem Artikel kurz analysieren. IV. Fragen zu Array// Sie müssen vue.js selbst importieren. In Zukunft werden wir versuchen, nur den Kerncode aufzulisten <div id='app'> <Abschnitt> {{ p1[0] }} {{ p1[1] }} </Abschnitt> </div> <Skript> const app = new Vue({ el: '#app', Daten: { p1: ['ph', '18'] } }) </Skript> Nach dem Ausführen wird auf der Seite Das Obige ist eine kurze Analyse der grundlegenden Implementierung von Änderungen der Vue-Erkennungsdaten. Weitere Informationen zu Änderungen der Vue-Erkennungsdaten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Installationsprozess von CentOS8 Linux 8.0.1905 (Abbildung)
>>: Detaillierte Erläuterung der Galera-Cluster-Bereitstellung im Clustermodus von MySQL
<br /> Dieser Artikel wurde von Rachel Golds...
#Case: Gehaltsstufen von Mitarbeitern abfragen WÄ...
Die vollständige Syntax der Select-Anweisung laut...
Wirkung: Ideen: Verwenden Sie das Eingabetypattri...
Inhaltsverzeichnis 1. Was ist Lazy Loading von Ro...
Wann ist die Installation durchzuführen? Wenn Sie...
for-Schleife Grundlegendes Syntaxformat: für (Var...
Versuchen Sie die Installation über Pip in einer ...
Frameset-Seiten unterscheiden sich etwas von norm...
Mysql ist eine beliebte und einfach zu bedienende...
Installieren Sie Docker im Linux-System neu und g...
Inhaltsverzeichnis Überblick Front-End-Wissenssys...
Wir alle wissen, dass wir den Befehl mkdir verwen...
Problem: Das PHP-Programm auf einem Server kann k...
Nach dem Docker-Lauf ist der Status immer „Beende...