Überprüfung der responsiven Prinzipien von Vue2// 1. Objektreaktivität: Durchlaufe jeden Schlüssel und definiere Getter und Setter // 2. Array-Reaktionsfähigkeit: Array-Prototyp-Methode überschreiben und zusätzliche Benachrichtigungslogik hinzufügen const originalProto = Array.prototype const arrayProto = Objekt.erstellen(originalProto) ;['push', 'pop', 'shift', 'unshift', 'spleißen', 'umkehren', 'sortieren'].forEach( Methode => { arrayProto[Methode] = Funktion () { originalProto[Methode].apply(diese, Argumente) benachrichtigenUpdate() } } ) Funktion beobachten(Objekt) { wenn (Typ von Objekt !== 'Objekt' || Objekt == null) { zurückkehren } // Array-Typ-Beurteilung hinzufügen. Wenn es ein Array ist, seinen Prototyp überschreiben, if (Array.isArray(obj)) { Objekt.setPrototypeOf(obj, arrayProto) } anders { const keys = Objekt.keys(obj) für (lass i = 0; i < Schlüssel.Länge; i++) { const Schlüssel = Schlüssel[i] defineReactive(Objekt, Schlüssel, Objekt[Schlüssel]) } } } Funktion defineReactive (Objekt, Schlüssel, Wert) { observe(val) // Das Problem verschachtelter Objekte lösen Object.defineProperty(obj, key, { erhalten () { Rückgabewert }, setze (neuerWert) { wenn (neuerWert !== Wert) { observe(newVal) // Neuer Wert ist ein Objekt val = newVal benachrichtigenUpdate() } } }) } Funktion Benachrichtigungsupdate () { console.log('Seite aktualisiert!') }
Analyse des Vue3-Responsive-PrinzipsVue3 verwendet die Proxy-Funktion von ES6, um diese Probleme zu lösen. Funktion reaktiv(Objekt) { wenn (Typ von Objekt !== 'Objekt' und Objekt != null) { Rückgabeobjekt } // Proxy entspricht dem Hinzufügen einer Interception zur äußeren Ebene des Objekts // http://es6.ruanyifeng.com/#docs/proxy const beobachtet = neuer Proxy(obj, { get (Ziel, Schlüssel, Empfänger) { // Reflect wird verwendet, um Standardoperationen an Objekten durchzuführen, was standardisierter und benutzerfreundlicher ist. // Proxy- und Objektmethoden haben entsprechende Reflect-Methoden. // http://es6.ruanyifeng.com/#docs/reflect const res = Reflect.get(Ziel, Schlüssel, Empfänger) console.log(`Holen Sie sich ${key}:${res}`) Rückgabewert }, set (Ziel, Schlüssel, Wert, Empfänger) { const res = Reflect.set(Ziel, Schlüssel, Wert, Empfänger) console.log(`Setzen Sie ${key}:${value}`) Rückgabewert }, deleteProperty (Ziel, Schlüssel) { const res = Reflect.deleteProperty(Ziel, Schlüssel) console.log(`lösche ${key}:${res}`) Rückgabewert } }) Rückkehr beobachtet } //Codetest const state = reactive({ foo: "foo", Balken: { a: 1 } }) // 1. state.foo abrufen // ok // 2. Setze das vorhandene Attribut state.foo = 'fooooooo' // ok // 3. Nicht vorhandenes Attribut state.dong = 'dong' setzen // ok // 4. Attribut löschen delete state.dong // ok Reaktionsfähigkeit verschachtelter ObjekteTest: Verschachtelte Objekte reagieren nicht // Verschachtelte Objekteigenschaften festlegen react.bar.a = 10 // nein ok Objekttyprekursion hinzufügen // Hilfsmethode extrahieren const isObject = val => val !== null && typeof val === 'object' Funktion reaktiv(Objekt) { //Beurteilen, ob es ein Objekt ist, if (!isObject(obj)) { Rückgabeobjekt } const beobachtet = neuer Proxy(obj, { get (Ziel, Schlüssel, Empfänger) { // ... // Wenn es ein Objekt ist, ist Rekursion erforderlich return isObject(res) ? reactive(res) : res }, //... } Vermeiden Sie doppelte AgentenWiederholende Wirkstoffe wie
Lösung : Zwischenspeichern Sie die vorherigen Proxy-Ergebnisse und verwenden Sie sie direkt beim Abrufen const toProxy = new WeakMap() // dasselbe wie obj:observed const toRaw = new WeakMap() // dasselbe wie beobachtet:obj Funktion reaktiv(Objekt) { //... // Cache durchsuchen um doppelte Proxys zu vermeiden if (toProxy.has(obj)) { zurück zu Proxy.get(obj) } wenn (toRaw.has(obj)) { Rückgabeobjekt } const beobachtet = neuer Proxy(...) // Proxy-Ergebnisse zwischenspeichern toProxy.set(obj, beobachtet) toRaw.set(beobachtet, Objekt) Rückkehr beobachtet } // Testeffekt console.log(reactive(data) === status) console.log(reaktiv(Status) === Status) ZusammenfassenDieser Artikel endet hier. Ich hoffe, er kann Ihnen helfen. Ich hoffe auch, dass Sie mehr Inhalt auf 123WORDPRESS.COM lesen können! Das könnte Sie auch interessieren:
|
<<: CSS3 erstellt 3D-Würfel-Ladeeffekte
>>: Informationen zur Layoutmethode für Inhaltsüberlauf in Tabellen
Ich bin heute auf ein seltsames Netzwerkproblem g...
Dieser Artikel beschreibt, wie man eine Phalcon-U...
In diesem Artikel wird der spezifische Code für d...
Inhaltsverzeichnis Wesentlicher Unterschied Daten...
Hallo zusammen! Ich bin Mr. Tony, der nur über Te...
Dieser Artikel ist eine MySQL-Konfigurationsdatei...
Inhaltsverzeichnis 1. Komponenteneinführung 2. In...
Inhaltsverzeichnis 1. Installieren Sie das Vue-Ge...
1. Ersetzen Sie die Adresse Ihrer .js-Bibliotheks...
Inhaltsverzeichnis 1. Projektanforderungen Zweite...
Abfrage-Cache 1. Funktionsprinzip des Abfrage-Cac...
Vorwort Ich arbeite derzeit an der Datenanalysepl...
Bei der Datenbankoperation ist der Umgang mit Dat...
Methode 1: Ändern Sie die Datei .bashrc oder .bas...
Anruf Wie rufe ich die Amap-API auf? Das offiziel...