So überwachen Sie Array-Änderungen in Vue

So überwachen Sie Array-Änderungen in Vue

Vorwort

Vor einiger Zeit habe ich die Prinzipien responsiver Daten in Vue kennengelernt (und mir Notizen zu den responsiven Prinzipien von Vue gemacht). Tatsächlich handelt es sich um ein responsives Design, das Getter und Setter über Object.defineProperty steuert und den Beobachtermodus verwendet. Dann verfügt das Array über eine Reihe von Operationsmethoden, die die Getter- und Setter-Methoden des Arrays nicht auslösen. Wie wird also das responsive Design für Arrays in Vue implementiert? Lassen Sie es uns gemeinsam lernen.

Quellcode

https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js

Wo beginne ich mit meinem ersten Lernschritt?

Ähm …
Ich denke, wir sollten zunächst das Prinzip der Datenreaktivität in Vue klären, damit wir besser verstehen, wie Array-Änderungen in Vue erkannt werden. Sie können den Artikel daher online finden und ihn mit dem Quellcode lesen. Ich glaube, Sie werden ihn verstehen. Ich möchte Ihnen einen Blog empfehlen, den ich zuvor gelesen habe, sowie den Lernbericht, den ich nach dem Lesen geschrieben habe, haha.

Vue-Responsive-Prinzip

Das Prinzip und die Implementierung der bidirektionalen Bindung in Vue

Okay, schauen wir uns das zuerst an. Ha ha!

Beginnen Sie mit einem Bild

Schauen wir uns zunächst das folgende Bild an und verstehen wir die Idee der Implementierung in Vue, damit diese klar und verständlich ist, wenn wir uns später die Implementierung des Quellcodes ansehen.

Schauen Sie sich dieses Bild an und denken Sie darüber nach. Haben Sie ein allgemeines Verständnis?

Stellen Sie zunächst fest, ob der Browser den __proto__-Zeiger unterstützt

Schreiben Sie diese 7 Methoden des Arrays neu und richten Sie das neu geschriebene Array dann auf den Prototyp des Arrays, je nachdem, ob __proto__ unterstützt wird.

Ist das nicht einfach? ! !

Schauen Sie sich den Quellcode an

Nachdem wir nun das Implementierungsprinzip verstanden haben, werfen wir einen Blick auf den Quellcode. Der Hauptzweck des Betrachtens des Quellcodes besteht darin, ein tieferes Verständnis dafür zu bekommen, wie der Autor ihn implementiert hat. Sie können sich auch hervorragende Codecodierungsmethoden ansehen und von ihnen lernen.

Ich habe einige Erklärungen in den Codeblock unten geschrieben!

//https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js


//Die Def-Methode ist eine Methodenschicht, die auf der Object.defineProperty-Kapselung basiert. Sie ist sehr einfach. Ich werde den Code unten posten, damit Sie nicht danach suchen müssen.
importiere { def } von '../util/index' 

//Speichern Sie das native Array-Prototypobjekt const arrayProto = Array.prototype

// Eine Prototypverbindung herstellen und den Prototyp von arrayMethods auf Array.prototype richten
exportiere const arrayMethods = Objekt.erstellen(arrayProto)

const methodsToPatch = [
  'drücken',
  'Pop',
  'Schicht',
  'aufheben',
  'spleißen',
  'Sortieren',
  'umkehren'
]

methodsToPatch.forEach(Funktion (Methode) {
  // Cache native Methode const original = arrayProto[Methode]
  def(ArrayMethods, Methode, Funktion Mutator (...args) {
    var args = [], 
    len = Argumente.Länge;
    während (Länge--) args[Länge] = Argumente[Länge];
    const result = original.apply(this, args) // Das ursprüngliche Ausführungsergebnis der Array-Methode const ob = this.__ob__ // Dieses __ob__ ist eine Instanz von Observe~~~~
    eingefügt lassen
    Schalter (Methode) {
      Fall 'push':
      Fall 'Unshift':
        eingefügt = Argumente
        brechen
      Fall 'Spleißen':
        eingefügt = args.slice(2)
        brechen
    }
    if (inserted) ob.observeArray(inserted) // Wenn sich das Array ändert, rufe observeArray erneut auf
    // Änderung melden
    ob.dep.notify() //
    Ergebnis zurückgeben
  })
})

Dies ist der Code für Observer:

var Beobachter = Funktion Beobachter(Wert) {
    dieser.Wert = Wert;
    dies.dep = neues Dep();
    dies.vmCount = 0;
    def(value, '__ob__', this); //Hier können Sie sehen, dass an jedes Objekt eine Observe-Instanz gebunden ist, daher ist this.__ob__ im obigen Code this if (Array.isArray(value)) { // Hier bestimmen wir, ob es sich um einen Array-Datentyp handelt. Wenn ja, wird observeArray verwendet
      wenn (hasProto) {
        protoAugment(Wert, ArrayMethoden);
      } anders {
        copyAugment(Wert, Array-Methoden, Array-Schlüssel);
      }
      this.observeArray(value); //Hier werden Daten vom Typ Array wie folgt verarbeitet} else {
      dies.walk(Wert);
    }
  };

Das Folgende ist die Implementierung von observeArray:

Observer.prototype.observeArray = Funktion observeArray(Elemente) {
    für (var i = 0, l = Elemente.Länge; i < l; i++) {
      observe(items[i]); // Die observe-Methode lautet wie folgt}
  };

Hier sehen wir uns die Beobachtungsmethode an:

Funktion beobachten(Wert, asRootData) {
    if (!isObject(value) || Wertinstanz von VNode) {
      zurückkehren
    }
    var ob;
    wenn (hasOwn(Wert, '__ob__') && Wert.__ob__ Instanz von Observer) {
      ob = Wert.__ob__;
    } sonst wenn (
      sollteBeobachten &&
      !isServerRendering() &&
      (Array.isArray(Wert) || isPlainObject(Wert)) &&
      Objekt.isExtensible(Wert) &&
      !Wert._isVue
    ) {
      ob = neuer Beobachter(Wert);
    }
    if (asRootData && ob) {
      ob.vmCount++;
    }
    return ob
  }

Hier geht es um die Implementierung der def-Methode. Sie ist sehr einfach, deshalb werde ich sie nicht näher erläutern:

Funktionsdefinition (Objekt, Schlüssel, Wert, aufzählbar) {
    Objekt.defineProperty(Objekt, Schlüssel, {
      Wert: val,
      aufzählbar: !!aufzählbar,
      beschreibbar: true,
      konfigurierbar: true
    });
}

Oben finden Sie Einzelheiten zur Überwachung von Array-Änderungen in Vue. Weitere Informationen zur Überwachung von Arrays durch Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • So überwachen Sie Array-Änderungen in Vue
  • Vue-Entwicklungsüberwachung zur Überwachung von Array-, Objekt- und Variablenoperationen
  • Vue überwacht Array-Änderungen Quellcode-Analyse
  • Vue-Schlüssel zur physischen Überwachung von Mobiltelefonen + Exit-Prompt-Code
  • Vue Deep Monitoring (Überwachung von Änderungen an Objekten und Arrays) und sofortige Ausführung von Überwachungsbeispielen
  • Die übergeordnete Vue-Komponente überwacht den Lebenszyklus der untergeordneten Komponente
  • Vue implementiert das Abhören von Fensterschließereignissen und das Senden von Anfragen, bevor das Fenster geschlossen wird
  • Vue überwacht den Änderungsvorgang der Treeselect-Auswahl
  • Vue überwacht Routenänderungen und aktualisiert die Seite in der Datei App.vue

<<:  So starten Sie Tomcat mit jsvc (als normaler Benutzer ausführen)

>>:  (MariaDB) Umfassende Erklärung der MySQL-Datentypen und Speichermechanismen

Artikel empfehlen

Das Lazy-Loading-Attributmuster in JavaScript verstehen

Traditionell erstellen Entwickler Eigenschaften i...

React implementiert den Beispielcode der Radiokomponente

Ziel dieses Artikels ist es, die Grundfunktionen ...

So verwenden Sie async await elegant in JS

Inhaltsverzeichnis $.ajax von jQuery Der Beginn d...

CSS zum Erzielen von Text auf dem Hintergrundbild

Wirkung: <div Klasse="imgs"> <...

js realisiert das Verpacken mehrerer Bilder in Zip

Inhaltsverzeichnis 1. Dateien importieren 2. HTML...

Beispielcode für die Codevorlage für die Linux C-Protokollausgabe

Vorwort Dieser Artikel stellt hauptsächlich den r...

Empfehlen Sie mehrere MySQL-bezogene Tools

Vorwort: Mit der kontinuierlichen Entwicklung der...

MySQL Slow Query-Optimierung: Die Vorteile von Limit aus Theorie und Praxis

Oftmals erwarten wir, dass das Abfrageergebnis hö...

Schritte für Vue3 zur Verwendung von Mitt für die Komponentenkommunikation

Inhaltsverzeichnis 1. Installation 2. Ins Projekt...

So ändern Sie das MySQL-Passwort unter Centos

1. MySQL-Anmeldeeinstellungen ändern: # vim /etc/...

Ein Beispiel für die Umgestaltung eines Puzzlespiels mit vue3

Vorwort Es dauerte zwei Tage, um ein Puzzlespiel ...

So zeigen Sie Dateien im Docker-Image an

So zeigen Sie Dateien in einem Docker-Image an 1....

Detaillierte Erklärung der API in Vue.js, die leicht zu übersehen ist

Inhaltsverzeichnis nächstesTick Syntaxvereinfachu...