Ü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
Nachfragehintergrund: Fügen Sie dynamische GIF-Bi...
Code kopieren Der Code lautet wie folgt: jQuery.c...
1. Laden Sie das Installationsskript - composer-s...
Ich wollte schon immer Kubernetes lernen, weil es...
So schreiben Sie Urteilsaussagen in MySQL: Method...
Hinweise zur Linux-Installation von MySQL 1. Stel...
Viele Leute haben dieses Buch gelesen: „Entwickel...
Erstellen Sie in MySQL eine neue Tabelle mit drei...
Bei Verwendung von apt-get zur Installation ist d...
Vorwort Dieser Artikel ist ziemlich ausführlich u...
Inhaltsverzeichnis Legen Sie beim Erstellen einer...
Ich habe heute MySQL 8.0 aktualisiert. Das erste ...
1. Schreiben Sie ein einfaches Java-Programm öffe...
Methoden zum Ändern von Passwörtern vor MySQL 5.7...
Ich möchte einen Artikel von Zhang Xinxu zitieren...