VorwortVor 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. Quellcodehttps://github.com/vuejs/vue/blob/dev/src/core/observer/array.js Wo beginne ich mit meinem ersten Lernschritt? Ähm … 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 BildSchauen 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 anNachdem 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 starten Sie Tomcat mit jsvc (als normaler Benutzer ausführen)
>>: (MariaDB) Umfassende Erklärung der MySQL-Datentypen und Speichermechanismen
Traditionell erstellen Entwickler Eigenschaften i...
Ziel dieses Artikels ist es, die Grundfunktionen ...
Inhaltsverzeichnis Versionshinweise Erstellen ein...
Inhaltsverzeichnis Überblick 1. Trennung von Fron...
Inhaltsverzeichnis $.ajax von jQuery Der Beginn d...
Wirkung: <div Klasse="imgs"> <...
Inhaltsverzeichnis 1. Dateien importieren 2. HTML...
Vorwort Dieser Artikel stellt hauptsächlich den r...
Vorwort: Mit der kontinuierlichen Entwicklung der...
Oftmals erwarten wir, dass das Abfrageergebnis hö...
Inhaltsverzeichnis 1. Installation 2. Ins Projekt...
1. MySQL-Anmeldeeinstellungen ändern: # vim /etc/...
Vorwort Es dauerte zwei Tage, um ein Puzzlespiel ...
So zeigen Sie Dateien in einem Docker-Image an 1....
Inhaltsverzeichnis nächstesTick Syntaxvereinfachu...