Zusammenfassung der Vue-Datenreaktionsfähigkeit

Zusammenfassung der Vue-Datenreaktionsfähigkeit

Bevor wir über die Datenreaktivität sprechen, müssen wir ein sehr wichtiges Problem lösen: Was genau macht Vue mit den Daten? Beginnen wir mit Gettern und Settern, die wir zum Lesen und Schreiben virtueller Eigenschaften verwenden.

Getter und Setter

Es gibt den folgenden Code

lass obj0 = {
 Nachname: "高",
 Name: "Yuan Yuan",
 Alter: 18
};

// Anforderung 1, den Namen abrufen let obj1 = {
 Nachname: "高",
 Name: "Yuan Yuan",
 Name() {
  gib diesen Nachnamen + diesen Namen zurück;
 },
 Alter: 18
};

console.log("Anforderung 1: " + obj1.Name()); //Gao Yuanyuan

Zu diesem Zeitpunkt ist das Ergebnis unserer Abmeldung Gao Yuanyuan, was jeder verstehen kann, aber können die Klammern nach dem Namen gelöscht werden? Nein, da es sich um eine Funktion handelt. Wie entfernen wir also die Klammern? Hier sind unsere Anforderungen

// Anforderung 2: Der Name kann ohne Klammern ermittelt werden let obj2 = {
 Nachname: "高",
 Name: "Yuan Yuan",
 getName() {
  gib diesen Nachnamen + diesen Namen zurück;
 },
 Alter: 18
};

console.log("Anforderung 2: " + obj2.Name); //Gao Yuanyuan

Dieses Mal verwenden wir einen Getter und können den Wert ohne Klammern abrufen. Wie ändern wir also den Namen?

// Anforderung 3: Der Name kann geschrieben werden let obj3 = {
 Nachname: "高",
 Name: "Yuan Yuan",
 getName() {
  gib diesen Nachnamen + diesen Namen zurück;
 },
 Name festlegen(xxx){
  dieser.Nachname = xxx[0]
  dieser.name = xxx.slice(1)
 },
 Alter: 18
};

obj3.Name = "Gao Yuanyuan"

console.log(`Anforderung 3: Nachname ${obj3.last name}, Vorname ${obj3.first name}`) // Gao Yuanyuan

Wo es „get“ gibt, gibt es auch „set“, und so wird „setter“ verwendet. Wir verwenden den Attributwert = xxx, um die Set-Funktion auszulösen, und der Name kann geschrieben werden. Wenn wir jedoch console.log(obj3) in Anforderung 3 eingeben, erhalten wir die folgende Abbildung:

Warum wird姓名:(...) wie im Bild angezeigt? Dies ist eigentlich ein Get-Set. Wenn der Browser den Namen anzeigt, gibt er姓名:(...) . Dies zeigt, dass wir den Namen in Anforderung drei lesen und schreiben können, aber es gibt kein Attribut namens Name. Stattdessen gibt es Get und Set, um die Operation mit dem Namen zu simulieren.

Objekt.defineProperty

Im obigen Beispiel verwenden wir get und set direkt beim Definieren des Objekts, aber wie fügen wir get weiterhin hinzu, wenn das Objekt deklariert wurde? Wir müssen Object.defineProperty oder Anforderung drei verwenden. Wir können get und set nach der Definition hinzufügen, indem wir den folgenden Code hinzufügen:

var _xxx = 0
Objekt.defineProperty(obj3,'xxx',{
 erhalten(){
  Rückgabewert _xxx
 },
 setze(Wert){
  _xxx= Wert
 }
})

Als nächstes können wir das ursprüngliche Problem lösen: Was genau macht Vue mit den Daten? Schauen wir uns einige Beispiele an:

lass data0 = {
 n: 0
}

Deklarieren Sie zuerst ein data0, Anforderung 1: Definieren Sie n mit Object.defineProperty :

lass data1 = {}

Objekt.defineProperty(data1, 'n', {
 Wert: 0
})

console.log(`Anforderung 1: ${data1.n}`) //Anforderung 1: 0

Anforderung 2: n kann nicht kleiner als 0 sein:

lass data2 = {}

data2._n = 0 // _n wird verwendet, um den Wert von n geheim zu speichern, der Standardwert ist 0

Objekt.defineProperty(data2, 'n', {
 erhalten(){
  gib dies zurück._n
 },
 setze(Wert){
  wenn(Wert < 0) return
  this._n = Wert
 }
})

console.log(`Anforderung 2: ${data2.n}`)//0
Daten2.n = -1
console.log(`Anforderung 2: ${data2.n} ist auf -1 gesetzt und schlägt fehl`) //0 ist auf -1 gesetzt und schlägt fehl data2.n = 1
console.log(`Anforderung 2: ${data2.n} wird auf 1 gesetzt. Erfolg`) //0 wird auf 1 gesetzt. Erfolg

Was aber, wenn die andere Partei data2._n direkt verwendet? Können wir auf dem Objekt nichts Zugängliches offenlegen? Zu diesem Zeitpunkt müssen wir einen Proxy verwenden:

let data3 = proxy({ data:{n:0} }) // Die Klammern sind anonyme Objekte und können nicht aufgerufen werden function proxy({data}){
 const obj = {}
 // Das 'n' ist hier fest codiert. Theoretisch sollte es alle Schlüssel der Daten durchlaufen. Ich habe es hier vereinfacht // weil ich befürchte, dass Sie Object.defineProperty(obj, 'n', { nicht verstehen können. 
  erhalten(){
   Daten zurückgeben.n
  },
  setze(Wert){
   wenn(Wert<0)zurück
   data.n = Wert
  }
 })
 return obj // obj ist der Proxy}

// data3 ist obj
console.log(`Anforderung 3: ${data3.n}`)
Daten3.n = -1
console.log(`Anforderung 3: ${data3.n}, auf -1 setzen fehlgeschlagen`)
Daten3.n = 1
console.log(`Anforderung 3: ${data3.n}, auf 1 gesetzt, Erfolg`)

Was aber, wenn Sie keinen Agenten beauftragen möchten?

lass meineDaten = {n:0}
let data4 = proxy({ data:myData }) // Das Objekt in den Klammern ist anonym und kann nicht aufgerufen werden // data3 ist obj
console.log(`Argumentativ: ${data4.n}`) //0
meineDaten.n = -1
console.log(`Argumentativ: ${data4.n}, auf -1 setzen fehlgeschlagen!?`)

Da myData immer noch auf diese Weise geändert werden kann, haben wir eine weitere Anforderung: Auch wenn der Benutzer myData ohne Autorisierung ändert, müssen wir dies abfangen:

lass myData5 = {n:0}
let data5 = proxy2({ data:myData5 }) // Die Klammern sind anonyme Objekte und können nicht aufgerufen werden function proxy2({data}){
 // Das 'n' ist hier fest codiert. Theoretisch sollten wir alle Schlüssel der Daten durchlaufen, aber wir vereinfachen es hier. let value = data.n //Speichern Sie das Start-n
 Object.defineProperty(data, 'n', {//Deklariere ein neues n
  erhalten(){
   Rückgabewert
  },
  setze(neuerWert){
   wenn(neuerWert<0)return
   Wert = neuerWert
  }
 })

Fügen Sie einfach die obigen Sätze hinzu, diese Sätze überwachen Daten

const obj = {}
 Objekt.defineProperty(obj, 'n', {
  erhalten(){
   Daten zurückgeben.n
  },
  setze(Wert){
   if(value<0)return//Dieser Satz enthält redundante Daten.n = value
  }
 })
 
 return obj // obj ist der Proxy}

// data3 ist obj
console.log(`Anforderung 5: ${data5.n}`) //0
meineDaten5.n = -1
console.log(`Anforderung 5: ${data5.n}, auf -1 setzen fehlgeschlagen`) //0
meineDaten5.n = 1
console.log(`Anforderung 5: ${data5.n}, erfolgreich auf 1 gesetzt`) //1

Wenn wir vm = new Vue({data:myData}) schreiben, macht Vue zwei Dinge:

  1. Lassen Sie vm der Proxy von myData sein, und Sie können über diesen auf vm zugreifen
  2. Alle Eigenschaften von myData werden überwacht, um zu verhindern, dass sich die Eigenschaften von myData ohne Wissen der VM ändern. Sobald sich die Eigenschaft ändert, kann render(data) aufgerufen und die Benutzeroberfläche automatisch aktualisiert werden.

Dann können wir zum Titel zurückkehren: Was ist Datenreaktivität? Ein Objekt ist responsiv, wenn es auf äußere Reize reagieren kann. Die Daten von Vue reagieren. In const vm = new Vue({data:{n:0}}) wird n in der Benutzeroberfläche entsprechend aktualisiert, wenn vm.n geändert wird. Vue implementiert die Datenreaktionsfähigkeit durch Object.defineProperty .
Was sind responsive Webseiten? Das heißt, wenn Sie die Größe des Fensters ändern, ändert sich der Inhalt der Webseite entsprechend. In diesem Fall wird diese Webseite als responsive Webseite bezeichnet.

Oben finden Sie eine detaillierte Zusammenfassung der Vue-Datenreaktionsfähigkeit. Weitere Informationen zur Vue-Datenreaktionsfähigkeit finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Arrays des Vue-Datenreaktionsprinzips
  • Tiefgreifendes Verständnis der Datenreaktionsfähigkeit von Vue
  • Detaillierte Erläuterung des Datenreaktionsprinzips von Vue
  • Zusammenfassung der Wissenspunkte zum Vue-Datenreaktivitätsprinzip
  • Wie wird die Datenreaktivität von Vue implementiert?
  • Eine kurze Diskussion über das Prinzip der Vue-Datenreaktionsfähigkeit
  • Vue erklärt das Prinzip der Datenreaktivität ausführlich

<<:  Grundkenntnisse zu MySQL – Lernhinweise

>>:  Detaillierte Erklärung zur Verwendung des Befehls tcpdump zum Erfassen und Analysieren von Datenpaketen in Linux

Artikel empfehlen

So migrieren Sie den MySQL-Speicherort auf eine neue Festplatte

1. Bereiten Sie eine neue Festplatte vor und form...

Express implementiert Login-Verifizierung

In diesem Artikelbeispiel wird der spezifische Co...

js implementiert Array-Abflachung

Inhaltsverzeichnis So reduzieren Sie ein Array 1....

Detaillierte Erklärung, wie zwei Node.js-Prozesse kommunizieren

Inhaltsverzeichnis Vorwort Kommunikation zwischen...

Starten Sie eine lokale Kubernetes-Umgebung mit Kind und Docker

einführen Haben Sie schon einmal einen ganzen Tag...

So deaktivieren Sie Webseitenstile mit dem Webentwickler von Firefox

Voraussetzung: Das Webentwickler-Plugin wurde inst...

So fragen Sie Bilder in einem privaten Register ab oder erhalten sie

Docker fragt Bilder in einem privaten Register ab...

Syntax-Alias-Problem basierend auf Löschen in MySQL

Inhaltsverzeichnis MySQL-Löschsyntax-Aliasproblem...

Lassen Sie uns im Detail darüber sprechen, wie Browser Abschlüsse betrachten

Inhaltsverzeichnis Vorwort Einführung in Closures...