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    

Artikel empfehlen

Vue erzielt einen nahtlosen Karusselleffekt

In diesem Artikel wird der spezifische Code von V...

Beispiele für 4 Methoden zum Einfügen großer Datenmengen in MySQL

Vorwort Dieser Artikel stellt hauptsächlich 4 Met...

So ändern Sie das Root-Passwort von Mysql5.7.10 auf dem MAC

Starten Sie MySQL zunächst im Skip-Grant-Tables-M...

Webinterview: Benutzerdefinierte Vue-Komponenten und Aufrufmethoden

Import: Aufgrund der Projektanforderungen werden ...

HTML 5 Vorschau

<br />Original: http://www.alistapart.com/ar...

Die Fallstricke bei der Bereitstellung von Angular-Projekten in Nginx

Wenn man online nach Methoden sucht, um Angular -...

So legen Sie schnell den Dateipfad-Alias ​​in React fest

React ist eine JavaScript-Bibliothek zum Erstelle...