Wenn ich eine Eigenschaft in Vue-Daten zufällig ändere, wird die Ansicht aktualisiert?

Wenn ich eine Eigenschaft in Vue-Daten zufällig ändere, wird die Ansicht aktualisiert?
  • Interviewer: Haben Sie den Quellcode von Vue gelesen?
  • Kandidat: Das habe ich.
  • Interviewer: Wird die Ansicht aktualisiert, wenn wir eine beliebige Eigenschaft in Vue data ändern?
  • Kandidat: Nein.
  • Interviewer: Warum?
  • Kandidaten: Wenn die Eigenschaft in der Vorlage nicht verwendet wird, besteht keine Notwendigkeit, die Ansicht zu aktualisieren. Eine häufige Aktualisierung führt zudem zu einer schlechten Leistung.
  • Interviewer: Wie implementieren Sie diese Lösung in Vue?
  • Kandidaten: Verwenden Sie während der Instanzinitialisierung Object.defineProperty , um die Eigenschaften in den Daten zu überwachen. Wenn die Eigenschaften in template verwendet werden, werden sie von der Dep-Klasse erfasst, und wenn die Eigenschaften geändert werden, wird „notify“ aufgerufen, um die Ansicht zu aktualisieren.
  • Interviewer: Woher wissen Sie, welche Attribute in der Vorlage verwendet werden?
  • Kandidat: WTF. . . Das ist nicht ganz klar. Könnten Sie es erklären?
  • Interviewer: OK, lassen Sie mich kurz erklären:

Schreiben wir zunächst eine einfache demo . Die Daten enthalten 4 Attribute a, b, c und d, und in der Vorlage werden nur a und b verwendet. Sehen Sie, ob nur A und B Dep anrufen, um sie abzuholen?

neuer Vue({
  el: '#app',
  Daten() {
    zurückkehren {
      ein: 1,
      b: 2,
      c: 3,
      d: 4,
    };
  },
  erstellt() {
    Konsole.log(dies.b);
    dies.b = "aaa";
  },
  Vorlage: '<div>Hallo Welt{{a}}{{b}}</div>',
});


In Vueinstance/state.js wird der Proxy verwendet, um jedes Attribut zu proxyen

const keys = Objekt.keys(Daten)
  const props = vm.$options.props
  const-Methoden = vm.$options.methods
  sei i = Schlüssel.Länge
  während (i--) {
    const Schlüssel = Schlüssel[i]
    wenn (Requisiten und hasOwn (Requisiten, Schlüssel)) {
      process.env.NODE_ENV !== 'Produktion' && warn(
        `Die Dateneigenschaft "${key}" ist bereits als Prop deklariert. ` +
        `Verwenden Sie stattdessen den Standardwert der Eigenschaft.`,
        vm
      )
    } sonst wenn (!isReserved(Schlüssel)) {
      //Eigenschaften des Proxy-Objekts proxy(vm, `_data`, key)
    }
  }
  // Daten beobachten
  beobachte(Daten, wahr /* alsRootData */)


Verwenden Sie defineReactive, um jedes Attribut in Daten zu kapern

beobachten(Daten, wahr /* asRootData */);

// beobachten
const keys = Objekt.keys(obj);
für (lass i = 0; i < Schlüssel.Länge; i++) {
  definiereReaktiv(Objekt, Schlüssel[i]);
}

// definiereReaktiv
Objekt.defineProperty(Objekt, Schlüssel, {
  aufzählbar: wahr,
  konfigurierbar: true,
  erhalten: Funktion reactiveGetter() {
    const Wert = Getter? getter.call(Obj) : Wert;
    // Der springende Punkt ist hier. Wenn die Attribute später in der Vorlage verwendet werden, wird die Funktion reactiveGetter ausgeführt // Wird von der Dep-Klasse gesammelt if (Dep.target) {
      console.log(`${key}-Eigenschaft wird von der Dep-Klasse erfasst`)
      dep.abhängig();
      wenn (KindOb) {
        childOb.dep.depend();
        wenn (Array.isArray(Wert)) {
          abhängigArray(Wert);
        }
      }
    }
    Rückgabewert;
  },
  set: Funktion reactiveSetter(newVal) {
    const Wert = Getter? getter.call(Obj) : Wert;
    /* eslint-deaktiviert keinen Selbstvergleich */
    wenn (neuerWert === Wert || (neuerWert !== neuerWert && Wert !== Wert)) {
      zurückkehren;
    }
    wenn (Setter) {
      // Hier ist die berechnete Menge der Funktion setter.call(obj, newVal);
    } anders {
      val = neuerWert;
    }
    childOb = !shallow und beobachten (neuer Wert);
    // Wenn wir die Eigenschaft ändern, rufen wir „notify“ auf, um die Ansicht asynchron zu aktualisieren dep.notify();
  },
});

Führen Sie $mount aus, um die Ansicht zu mounten

wenn (vm.$options.el) {
  vm.$mount(vm.$options.el);
}


$mount ist eine Methode, die den Vue-Prototyp aufruft. Der entscheidende Punkt ist der letzte Satz mount.call(this, el, hydrating)

Vue.prototype.$mount = Funktion (
  el?: Zeichenfolge | Element,
  hydratisierend?: Boolesch
): Komponente {
  el = el && Abfrage(el);

  const Optionen = diese.$Optionen;
  // Vorlage/EL auflösen und in Renderfunktion umwandeln
  /**
   * Prüfen, ob die Renderfunktion vorhanden ist? Wenn es nicht existiert, analysieren Sie die Vorlage template* Wenn Vue eine Seite rendert, gibt es zwei Möglichkeiten: 1. Vorlage, 2. Rendern. Letztendlich müssen alle Vorlagenklassen mit render*/ gerendert werden.
  wenn (!optionen.render) {
    let Vorlage = Optionen.Vorlage;
    wenn (Vorlage) {
      wenn (Typ der Vorlage === 'Zeichenfolge') {
        wenn (template.charAt(0) === '#') {
          Vorlage = idToTemplate(Vorlage);
          /* istanbul ignorieren wenn */
          wenn (Prozess.env.NODE_ENV !== 'Produktion' && !Vorlage) {
            warnen(
              `Vorlagenelement nicht gefunden oder leer: ${options.template}`,
              Das
            );
          }
        }
      } sonst wenn (Vorlage.Knotentyp) {
        Vorlage = Vorlage.innerHTML;
      } anders {
        wenn (Prozess.Umgebung.NODE_ENV !== 'Produktion') {
          warnen('ungültige Vorlagenoption:' + Vorlage, diese);
        }
        gib dies zurück;
      }
    } sonst wenn (el) {
      // Wenn die Vorlage nicht existiert, erstellen Sie eine Standard-HTML-Vorlage. Vorlage = getOuterHTML(el);
    }
  }
  // Vue.prototype.$mount neu schreiben und abschließend die zwischengespeicherte Mount-Methode aufrufen, um das Mounten von $mount abzuschließen return mount.call(this, el, hydrating);
};

Hier ruft mount die Methode mountComponent(this, el, hydrating) auf, mountComponent führt die Funktion _render aus und schließlich ruft _render render auf, um einen Vnode zu generieren.

const { render, _parentVnode } = vm.$optionen;
vnode = render.call(vm._renderProxy, vm.$createElement);


Das letzte Bild zeigt, dass render Renderfunktion template in unserer demo rendert. Am Ende werden nur die beiden Attribute a und b von der Dep-Klasse gesammelt.

Wenn der Artikel Fehler enthält, weisen Sie mich bitte darauf hin und ich werde ihn weiter verbessern. Vielen Dank. Wenn Sie den Quellcode debuggen müssen, klicken Sie hier und folgen Sie der Readme-Datei. Hoffnungsstern

Dies ist das Ende dieses Artikels über das Ändern einer Eigenschaft in Vue-Daten. Wird die Ansicht aktualisiert? Für relevantere Vue-Dateninhalte suchen Sie bitte nach früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Wissen Sie, warum Vue-Daten eine Funktion sind?
  • vue ändert Datenprobleme und zeigt Vorgänge in Echtzeit an
  • Vue-Unterkomponente ändert Daten oder ruft Operationen auf
  • Lösungsschritte für die Echtzeitsynchronisierung, nachdem Vue-Datenvariablen einander zugewiesen wurden

<<:  Importieren von CSS-Dateien unter Verwendung von Beurteilungsbedingungen

>>:  HTML+CSS3-Code zur Realisierung des Animationseffekts der Planeten des Sonnensystems

Artikel empfehlen

Webpack lädt CSS-Dateien und ihre Konfigurationsmethode

webpack lädt CSS-Dateien und deren Konfiguration ...

Detaillierte Erläuterung der Nginx-Anti-Hotlink- und Anti-Crawler-Konfiguration

Erstellen Sie eine neue Konfigurationsdatei (gehe...

Kontinuierliche Bereitstellung mit Jenkins und Docker unter Docker

1. Was ist Continuous Delivery Der Ausgabeprozess...

So installieren Sie die MySQL 8.0-Datenbank auf dem M1-Chip (Bild und Text)

1. Herunterladen Zunächst möchte ich einen inländ...

Befehl zum Entfernen (Löschen) eines symbolischen Links in Linux

Möglicherweise müssen Sie in Linux manchmal symbo...

Ausführliche Erläuterung versteckter Felder, einer neuen Funktion von MySQL 8.0

Vorwort MySQL Version 8.0.23 fügt eine neue Funkt...

Das Vue-Projekt realisiert Anmelde- und Registrierungseffekte

In diesem Artikelbeispiel wird der spezifische Co...

So stellen Sie Go-Webanwendungen mit Docker bereit

Inhaltsverzeichnis Warum brauchen wir Docker? Bei...

MySQL-Datenbanktabellendesign mit Baumstruktur

Inhaltsverzeichnis Vorwort 1. Basisdaten 2. Verer...