Implementieren Sie ein einfaches Datenantwortsystem

Implementieren Sie ein einfaches Datenantwortsystem

1. Dep

Tatsächlich handelt es sich hierbei um einen Container zum Sammeln von Abhängigkeiten. depend sammelt Abhängigkeiten und notify löst Abhängigkeiten aus.

Klasse Dep{
  Konstruktor() {
    dies._subs = [];
  }
  abhängen() {
    dies._subs.push(Dep.target)
  }
  benachrichtigen() {
    this._subs.forEach(item => {
      Element.fn();
    })
  }
}

// Tatsächlich ist dies der Beginn der Liebe zwischen Dep und Watcher. // Eine globale Eigenschaft wird in Watcher verwendet, um Watcher zu speichern
Dep.Ziel = null;

Funktion pushTarget(watch) {
  Dep.target = beobachten;
}

Funktion popTarget() {
  Dep.Ziel = null;
}

2. Verstehen Sie den Beobachter

Alle Eigenschaften des Datenobjekts rekursiv in Accessor-Eigenschaften umwandeln

// In Accessor-Eigenschaftsfunktion konvertieren defineReactive (obj, key, val, shallow) {

  // Einen Container für die Abhängigkeitssammlung erstellen let dep = new Dep();
  let childOb = !shallow und observe(val)

  Objekt.defineProperty(Objekt, Schlüssel, {
    aufzählbar: wahr,
    konfigurierbar: true,
    get: Funktion reactiveGetter () {
      wenn(Dep.target) {
        // Abhängigkeiten sammeln dep.depend();
      }
      Rückgabewert;
      // ...
    },
    set: Funktion reactiveSetter (newVal) {
      wenn (neuer Wert === Wert) return;
      // Weiter rekursiv durchlaufen observe(newVal);
      //Abhängigkeit auslösen dep.notify();
      // ...
    }
  })
}

Klasse Beobachter{
  Konstruktor(Daten) {
    dies.walk(Daten);
  }

  gehe(Daten) {
    const keys = Objekt.keys(Daten)
    für (lass i = 0; i < Schlüssel.Länge; i++) {
      defineReactive(Daten, Schlüssel[i], Daten[Schlüssel[i]])
    }
  }
}

// Alle Eigenschaften des Datenobjekts rekursiv in Accessor-Eigenschaften umwandeln function observe (data) {
  wenn(Object.prototype.toString.call(data) !== '[Objekt Objekt]') return;
  neuer Beobachter (Daten);
}

An diesem Punkt können Sie alle Eigenschaften eines beliebigen Objekts in Accessoren umwandeln

3. Verstehen Sie Uhr und Beobachter

const Daten = {
  ein: 1,
  b: 2
}

//Überwachen Sie zuerst ein Objekt. observe(data);

Die Hauptfunktion watcher besteht darin, ein bestimmtes Attribut zu erkennen und einen Rückruf auszulösen, wenn sich das Attribut ändert.

Klasse Watcher{
  /**
  * @params {Funktion} exp ein Eigenschaftsausdruck * @params {Funktion} fn Rückruf */
  Konstruktor(Ausdruck, Funktion) {
    dies.exp = exp;
    dies.fn = fn;

    //Watcher speichern
    // Dep.target = dies;
    drückeZiel(dieses);

    //Führen Sie die Ausdrucksfunktion zunächst einmal aus und führen Sie im aufrufenden Prozess
    // Den Accessor für data.a auslösen und das Abrufen von data.a wird ausgeführt.
    // Lösen Sie dep.depend() aus, um mit dem Sammeln von Abhängigkeiten zu beginnen. this.exp();

    // Dep.target freigeben
    popZiel();
  }
}

// neuer Watcher Eine solche Abhängigkeit wird gesammelt new Watcher(() => {
  gib Daten.a + Daten.b zurück;
}, () => {
  console.log('ändern')
})

4. Trigger-Abhängigkeit

data.a = 3; // ändern
data.b = 3; // ändern

5. Fassen Sie den Prozess zusammen

  • Konvertieren Sie alle Eigenschaften eines Objekts in Accessoren
  • Wenn einer Eigenschaft watcher hinzugefügt wird, wird get -Funktion der Eigenschaft ausgelöst. Der watcher wird in der get -Funktion im dep Abhängigkeitscontainer der Eigenschaft gespeichert.
  • Wenn sich diese Eigenschaft ändert, wird die set Methode der Eigenschaft ausgelöst. set Funktion führt alle in dep gespeicherten Abhängigkeiten aus.

Dies ist das Ende dieses Artikels über die Implementierung eines einfachen Datenantwortsystems. Weitere relevante Inhalte zum Datenantwortsystem finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Verwendung eines Datenantwortsystems für die Vue-Quellcodeanalyse

<<:  Farbige Anzeige der Hexadezimal-Farbcodetabelle und Anzeige des Hexadezimalwertvergleichs für eine einfache Suche

>>:  So steuern Sie den Anteil untergeordneter Flex-Elemente auf der Hauptachse

Artikel empfehlen

Zusammenfassung der Vorteile von Vue3 gegenüber Vue2

Inhaltsverzeichnis 1. Warum brauchen wir vue3? 2....

Verwenden von js zur Realisierung eines dynamischen Hintergrunds

In diesem Artikelbeispiel wird der spezifische Co...

MySQL Community Server 5.7.19 Installationshandbuch (detailliert)

Link zum Download der ZIP-Datei auf der offiziell...

So verwenden Sie die MySQL-Indexzusammenführung

Die Indexzusammenführung ist ein intelligenter Al...

So stellen Sie eine Nextcloud-Netzwerkfestplatte mit Docker bereit

NextCloud Sie können beliebige Dateien oder Ordne...

Grafisches Tutorial zur Installation und Konfiguration von Mysql WorkBench

In diesem Artikel erfahren Sie mehr über die Inst...

Implementierung des klassischen CSS-Sticky-Footer-Layouts

Was ist ein Sticky-Footer-Layout? Unser übliches ...

Lernbeispiel für den Nginx Reverse Proxy

Inhaltsverzeichnis 1. Reverse-Proxy-Vorbereitung ...