Detaillierte Erklärung des Responsive-Prinzips von Vue3

Detaillierte Erklärung des Responsive-Prinzips von Vue3

Ü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!')
}

Nachteile der Reaktionsfähigkeit von Vue2:
Der Reaktionsprozess erfordert eine rekursive Durchquerung, die viele Ressourcen verbraucht. Neu hinzugefügte oder gelöschte Attribute können nicht überwacht werden. Die Array-Reaktion erfordert eine zusätzliche Implementierung.
Map, Set, Class usw. können nicht responsiv geändert werden und haben eine eingeschränkte Syntax

Analyse des Vue3-Responsive-Prinzips

Vue3 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 Objekte

Test: 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 Agenten

Wiederholende Wirkstoffe wie

reactive(data) // Reines Objekt, das geproxied wurde
reaktiv (reagieren) // Proxy-Objekt

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)

Zusammenfassen

Dieser 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:
  • Analyse des Implementierungsprinzips des V-Modells und der Reaktionsfähigkeit in Vue
  • Detailliertes Beispiel des Vue-Reaktionsprinzips
  • Detailliertes Funktionsprinzip von Vue3.0
  • Detaillierte Erklärung der Prinzipien des responsiven Systems von Vue
  • Detaillierte Erklärung des VUE-Reaktionsprinzips
  • Detaillierte Erläuterung der Implementierung des VUE-Responsive-Prinzips

<<:  CSS3 erstellt 3D-Würfel-Ladeeffekte

>>:  Informationen zur Layoutmethode für Inhaltsüberlauf in Tabellen

Artikel empfehlen

jQuery manipuliert Cookies

Code kopieren Der Code lautet wie folgt: jQuery.c...

So installieren Sie Composer unter Linux

1. Laden Sie das Installationsskript - composer-s...

Einführung in Kubernetes (k8s)

Ich wollte schon immer Kubernetes lernen, weil es...

Zusammenfassung der Methoden zum Schreiben von Urteilsaussagen in MySQL

So schreiben Sie Urteilsaussagen in MySQL: Method...

Linux-Installation MySQL5.6.24 Nutzungsanweisungen

Hinweise zur Linux-Installation von MySQL 1. Stel...

Zusammenfassung der drei Phasen der Entwicklung eines visuellen Designers

Viele Leute haben dieses Buch gelesen: „Entwickel...

So optimieren Sie MySQL-Gruppen nach Anweisungen

Erstellen Sie in MySQL eine neue Tabelle mit drei...

So ändern Sie die Apt-Get-Quelle in Ubuntu 18.04

Bei Verwendung von apt-get zur Installation ist d...

Lokale MySQL-Installation und Problemlösung

Vorwort Dieser Artikel ist ziemlich ausführlich u...

Erläuterung des MySQL-Nicht-Null-Einschränkungsfalls

Inhaltsverzeichnis Legen Sie beim Erstellen einer...

Detaillierte Erklärung der Fallstricke von MySQL 8.0

Ich habe heute MySQL 8.0 aktualisiert. Das erste ...

Zusammenfassung der Methoden zur Änderung von MySQL-Passwörtern

Methoden zum Ändern von Passwörtern vor MySQL 5.7...