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

Implementierung eines MySQL-Gemeinschaftsindex (zusammengesetzter Index)

Gemeinsamer Index Die Definition des gemeinsamen ...

So finden Sie den angegebenen Inhalt einer großen Datei in Linux

Denken Sie im Großen und im Kleinen und lenken Si...

js-Code zur Realisierung eines Chatrooms für mehrere Personen

In diesem Artikelbeispiel wird der spezifische Co...

Detaillierte Erklärung des Übergangsattributs einer einfachen CSS-Animation

1. Verständnis der Übergangsattribute 1. Das Über...

Das WeChat-Applet implementiert feste Header- und Listentabellenkomponenten

Inhaltsverzeichnis brauchen: Funktionspunkte Rend...

Mehrere Methoden zum Ändern des MySQL-Root-Passworts (empfohlen)

Methode 1: Verwenden Sie den Befehl SET PASSWORD ...

Detaillierte Erklärung von count(), group by, order by in MySQL

Ich bin vor Kurzem auf ein Problem gestoßen, als ...

Einführung in die Verwendung gängiger XHTML-Tags

Es gibt viele Tags in XHTML, aber nur wenige werd...

Tutorial zur HTML-Tabellenauszeichnung (4): Rahmenfarbenattribut BORDERCOLOR

Um die Tabelle zu verschönern, können Sie untersc...