Ü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
Vorwort: In diesem Artikel werden nur die Schritt...
Vorwort Wir sagen oft, dass Node keine neue Progr...
Inhaltsverzeichnis Verzeichnisstruktur bin-Verzei...
Inhaltsverzeichnis 1. Holen Sie sich einen zufäll...
Lassen Sie mich Ihnen ohne weitere Umschweife den...
1 Laden Sie MySQL8 von der offiziellen Website he...
TOP-Beobachtung: Der Prozentsatz der CPU-Zeit, de...
1. Laden Sie das Axios-Plugin herunter cnpm insta...
Inhaltsverzeichnis Einführung Untergeordneter Pro...
Ich habe vor kurzem ein kleines Programmierprojek...
Inhaltsverzeichnis Vorwort: 1. Standardwertbezoge...
Inhaltsverzeichnis Einführung in die WiFi-Wireles...
In diesem Artikel finden Sie das grafische Tutori...
Vorwort In diesem Artikel werden hauptsächlich di...
Anfänger können HTML lernen, indem sie einige HTM...