Dieser Artikel richtet sich hauptsächlich an diejenigen, die den responsiven Quellcode von Vue nicht verstehen oder noch nicht damit in Berührung gekommen sind. Sein Hauptzweck besteht darin, ein grundlegendes Verständnis des responsiven Prinzips von Vue zu vermitteln. Wenn Ihnen in einem Vorstellungsgespräch solche Fragen gestellt werden, wissen Sie, was der Interviewer von Ihnen als Antwort erwartet? PS: Sollte der Artikel Fehler enthalten, können Sie diese gern korrigieren. Reaktionsschnelles Verständnis Reaktionsfähigkeit bedeutet, wie der Name schon sagt, dass Datenänderungen eine Aktualisierung der Ansicht bewirken. In diesem Artikel wird hauptsächlich die Implementierung der Objekt- und Array-Reaktionsfähigkeit in Vue2.0 analysiert. Die Sammlung von Abhängigkeiten und die Anzeige von Aktualisierungen verschieben wir auf den nächsten Artikel. In Vue beziehen sich die von uns erwähnten responsiven Daten im Allgemeinen auf Daten vom Typ Array und Objekttyp. Vue entführt die Eigenschaften eines Objekts intern über die Methode Object.defineProperty und das Array wird durch Überschreiben der Array-Methode implementiert. Lassen Sie es uns unten einfach implementieren. Zuerst definieren wir die Daten, die abgefangen werden müssen. const vm = neuer Vue({ Daten () { zurückkehren { Anzahl: 0, Person: {Name: 'xxx'}, arr: [1, 2, 3] } } }) let arrayMethods function Vue (options) { // Betrachte hier nur die Datenoperation let data = options.data wenn (Daten) { Daten = dies._Daten = Datentyp === 'Funktion' ? Datenaufruf(dies) : Daten } Beobachter (Daten) } Funktion Beobachter(Daten) { wenn (Datentyp !== 'Objekt' || Daten === null) { Rückgabedaten } if (data.__ob__) { // Die Existenz des Attributs __ob__ zeigt an, dass es abgefangen wurde. Daten zurückgeben } neuer Beobachter (Daten) } Bitte lesen Sie weiter unten für die Implementierung und Funktion von arrayMethods, Observer und __ob__ Implementieren der Observer-KlasseKlasse Beobachter { Konstruktor (Daten) { Object.defineProperty(data, '__ob__', { // Definiere die __ob__-Eigenschaft für data, die bei Array-Hijacking benötigt wird enumerable: false, // Nicht aufzählbar configurable: false, // Nicht konfigurierbar value: this // Der Wert ist die Observer-Instanz }) if (Array.isArray(data)) { //Array abfangen data.__proto__ = arrayMethods //Prototyp-Vererbung this.observerArray(data) } sonst { // Objektabfangen this.walk(data) } } Spaziergang (Daten) { const keys = Objekt.keys(Daten) für(lass i = 0; i < Schlüssel.Länge; i++) { const Schlüssel = Schlüssel[i] defineReactive(Daten, Schlüssel, Daten[Schlüssel]) } } observerArray (data) { // jedes Element im Array abfangen data.forEach(value => observer(value)) } } ObjektabfangenEinige wichtige Hinweise zum Objekt-Hijacking:
//Intercept-Funktion des Verarbeitungsobjekts defineReactive(data, key, value) { observer(value) // Wenn value immer noch ein Objekttyp ist, müssen Sie Object.defineProperty(data, key, { rekursiv kapern. erhalten() { Rückgabewert }, setze(neuerWert){ wenn (neuerWert === Wert) return Wert = neuerWert observer(newValue) // Wenn der newValue-Wert auch ein Objekttyp ist, muss er gekapert werden} }) } Array-HijackingEinige wichtige Hinweise zum Array-Hijacking:
const oldArrayPrototype = Array.prototype arrayMethods = Objekt.create(alterArrayPrototyp) const methods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'] // Methoden, die das ursprüngliche Array ändern können methods.forEach(method => { arrayMethods[Methoden] = Funktion (...Argumente) { const Ergebnis = alterArrayPrototyp[Methoden].call(diese, ...Argumente) const ob = this.__ob__ // dies ist das Array, das die Methode let inserted aufruft; // Die Sammlung der neu hinzugefügten Elemente im Array muss abgefangen werden switch(methods) { Fall 'push': Fall 'Unshift': eingefügt = Argumente Fall 'Spleißen': inserted = args.slice(2) // Weil der zweite Parameter von splice derjenige ist, der hinzugefügt wird} wenn (eingefügt) { ob.observerArray(eingefügt) } Ergebnis zurückgeben } }) Zusammenfassung der Prinzipien Wenn wir im Interview das Reaktionsfähigkeitsprinzip von Vue handschriftlich schreiben müssen, reicht der obige Code aus. Wenn wir jedoch den Quellcode von Vue kennen und im Vorstellungsgespräch die folgenden zusammenfassenden Antworten geben können, wird uns der Interviewer den Vorzug geben. Das responsive Prinzip des Vue 2.0-Quellcodes:
Reaktionsprinzip des Vue 3.0-Quellcodes:
const handler = { get (Ziel, Schlüssel) { wenn (Typ von Ziel[Schlüssel] === 'Objekt' und Ziel[Schlüssel] !== null) { gib neuen Proxy zurück (Ziel[Schlüssel], Handler) } returniere Reflect.get(Ziel, Schlüssel) }, set (Ziel, Schlüssel, Wert) { if(Schlüssel === 'Länge') returniere true console.log('aktualisieren') returniere Reflect.set(Ziel, Schlüssel, Wert) } } const obj = { arr: [1, 2, 3], Anzahl: { Num: 1 } } // obj ist das Zielobjekt des Proxys, handler ist das Konfigurationsobjekt const proxy = new Proxy(obj, handler) Dies ist das Ende dieses Artikels mit der detaillierten Erläuterung des Datenreaktionsprinzips von Vue. Weitere relevante Inhalte zur Datenreaktion von Vue finden Sie in früheren Artikeln auf 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:
|
<<: Schritte der Docker-Lernmethode zum Erstellen des ActiveMQ-Nachrichtendienstes
>>: Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.16 (Ubuntu 16.04)
Mit dem img-Element können wir Bilder in HTML-Dok...
<br />Bei Diskussionen mit meinen Freunden h...
Inhaltsverzeichnis Was ist ein Skelettsieb? Demo ...
Brotli ist ein neues Datenformat, das eine um 20 ...
Vor Kurzem mussten wir eine geplante Migration de...
Letztes Mal haben wir über einige SQL-Abfrageopti...
Parameter im Zusammenhang mit dem langsamen Abfra...
Hintergrund In der Gruppe werden einige Studieren...
Inhaltsverzeichnis 1. Anonyme Slots 2. Benannte S...
1. Überprüfen Sie den Firewall-Status Überprüfen ...
Vor ein paar Tagen habe ich auf Codepen ein Beisp...
Die Informationen auf Baidu sind so vielfältig, d...
Inhaltsverzeichnis Einführung Ideen Erstellen ein...
Zu lösendes Problem Hauptsächlich für die ebenenü...
Entwicklungstrends: html (Hypertext-Markup-Sprache...