VorwortIn Vue ist die Datenoption eine gute Sache. Sobald Sie die Daten eingegeben haben, können Sie die Daten überall in einer Vue-Komponente lesen. Allerdings muss der Missbrauch zum Lesen von Daten in Daten vermieden werden. In dieser Spalte wird erklärt, wo Missbrauch vermieden werden kann und welche Konsequenzen sich aus Missbrauch ergeben. 1. Der Prozess der Verwendung dieser Daten zum Lesen in DatenIm Vue-Quellcode werden den Daten Getter-Funktionen und Setter-Funktionen hinzugefügt, um sie in einen responsiven Datencode umzuwandeln. Der Code der Getter-Funktion lautet wie folgt: Funktion reactiveGetter() { var-Wert = Getter? getter.call(Obj) : val; wenn (Dep.target) { dep.abhängig(); wenn (KindOb) { childOb.dep.depend(); wenn (Array.isArray(Wert)) { abhängigArray(Wert); } } } Rückgabewert } Wenn dies zum Lesen von Daten in Daten verwendet wird, wird die Getter-Funktion ausgelöst, in der Hieraus lässt sich die Schlussfolgerung ziehen, dass bei Vorhandensein von Dep.target die Verwendung dieses Elements zum Lesen von Daten in Daten Abhängigkeiten sammelt. Wenn dies missbraucht wird, um Daten in Daten zu lesen, werden Abhängigkeiten wiederholt gesammelt, was zu Leistungsproblemen führt. 2. Wann existiert Dep.target?Dep.target wird durch die Abhängigkeit zugewiesen. Abhängigkeiten werden auch Beobachter oder Abonnenten genannt. Es gibt drei Arten von Abhängigkeiten in Vue, von denen zwei sehr häufig sind, nämlich watch (Listener) und computed (berechnete Eigenschaften). Es gibt auch eine versteckte Abhängigkeit, Rendering Watcher, die beim ersten Rendern der Vorlage erstellt wird. Dep.target wird zugewiesen, wenn die Abhängigkeit erstellt wird, und die Abhängigkeit wird mit dem Konstruktor Watcher erstellt. Funktion Watcher(vm, expOrFn, cb, Optionen, isRenderWatcher) { //... wenn (Typ von expOrFn === 'Funktion') { this.getter = expOrFn; } anders { this.getter = parsePath(expOrFn); } dieser.Wert = dieser.lazy ? undefiniert : dieser.get(); }; Watcher.prototype.get = Funktion get() { drückeZiel(dieses); versuchen { Wert = this.getter.call(vm, vm); } fangen (e) { } Rückgabewert }; Dep.Ziel = null; var ZielStack = []; Funktion pushTarget(Ziel) { ZielStack.push(Ziel); Dep.Ziel = Ziel; } Im Konstruktor Watcher wird am Ende die Instanzmethode Die Abhängigkeit wird erstellt, wenn die Vue-Seite oder -Komponente zum ersten Mal gerendert wird. Das Leistungsproblem dürfte also das Problem des langsamen ersten Renderings sein. 3. Wo kann man dies missbrauchen, um Daten in Daten zu lesen?Wenn Dep.target vorhanden ist, führt die Ausführung dieser Codes, die dies missbrauchen, um Daten in Daten zu lesen, zu Leistungsproblemen. Daher müssen wir auch herausfinden, wo diese Codes geschrieben werden, damit sie ausgeführt werden. Mit anderen Worten: Wir müssen herausfinden, wo der Missbrauch von this zum Lesen von Daten in Daten zu Leistungsproblemen führt. Im zweiten Abschnitt wird eingeführt, dass nach der Zuweisung von Depth.target
var bailRE = neuer RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]")); Funktion parsePath(Pfad) { if (bailRE.test(Pfad)) { zurückkehren } var Segmente = Pfad.split('.'); Rückgabefunktion (Objekt) { für (var i = 0; i < Segmente.Länge; i++) { wenn (!obj) { zurückkehren } obj = obj[Segmente[i]]; } Rückgabeobjekt } } Im folgenden Code wird durch Übergeben von betrachten:{ a:Funktion(neuerWert, alterWert){ //Mach etwas} } vm.$watch('abc', Funktion (neuerWert, alterWert) { // etwas tun })
berechnet:{ d:Funktion(){ lass Ergebnis = 0; für (let-Schlüssel in this.a) { wenn(this.a[key].num > 20){ Ergebnis += dies.a[Schlüssel].num + dies.b + dies.c; }anders{ Ergebnis += dies.a[Schlüssel].num + dies.e + dies.f; } } Ergebnis zurückgeben; } } Bei der berechneten Eigenschaft d liegt ein Missbrauch zum Auslesen von Daten vor. Hier ist
updateComponent = Funktion() { vm._update(vm._render(), hydratisieren); }; Unter diesen konvertiert Beispiel: Vorlage Vorlage: <Vorlage> <div Klasse="wrap"> <p>{{a}}<span>{{b}}</span></p> </div> </Vorlage> Die Rendering-Funktion „Render“ wird von Vue-Loader generiert, wie unten gezeigt: (Funktion anonym() { mit(diesem) { return _c('div', { Attribute: { "Klasse": "Wrap" } }, [_c('p', [_v(_s(a)), _c('span', [_v(_s(b))])])]) } }) Die Funktion der with-Anweisung besteht darin, ein Standardobjekt für eine oder eine Gruppe von Anweisungen anzugeben. Beispielsweise ist <Vorlage> <div Klasse="wrap"> <div v-for=Element in Liste> <div> {{ arr[item.index]['name'] }} </div> <div> {{ obj[item.id]['Alter'] }} </div> </div> </div> </Vorlage> Wenn v-for zum Durchlaufen des Listen-Arrays verwendet wird, werden damit die Daten von arr und obj in den Daten gelesen, sodass diese Daten einer Reihe komplexer logischer Operationen unterzogen werden, um diese Abhängigkeit wiederholt zu erfassen, was das anfängliche Rendern verlangsamt und Leistungsprobleme verursacht. 4. So vermeiden Sie den Missbrauch zum Lesen von Daten in DatenZusammenfassend lässt sich sagen, dass der Missbrauch zum Lesen von Daten in berechneten Eigenschaften und Vorlagen zu einer wiederholten Sammlung von Abhängigkeiten führt, was zu Leistungsproblemen führt. Wie können wir diese Situation vermeiden?
Um dies zu vermeiden, verwenden Sie die ES6-Objektdekonstruktionszuweisung. Der Wert der berechneten Eigenschaft ist eine Funktion, deren Parameter das von Vue instanziierte Objekt ist. Im obigen Beispiel des Missbrauchs in der berechneten Eigenschaft kann es wie folgt optimiert werden. Vor der Optimierung: berechnet:{ d:Funktion(){ lass Ergebnis = 0; für (let-Schlüssel in this.a) { wenn(this.a[key].num > 20){ Ergebnis += dies.a[Schlüssel].num + dies.b + dies.c; }anders{ Ergebnis += dies.a[Schlüssel].num + dies.e + dies.f; } } Ergebnis zurückgeben; } } Nach der Optimierung: berechnet: { d({ a, b, c, e, f }) { lass Ergebnis = 0; für (let-Taste in a) { wenn (a[Schlüssel].num > 20) { Ergebnis += a[Schlüssel].Nummer + b + c; } anders { Ergebnis += a[Schlüssel].num + e + f; } } Ergebnis zurückgeben; } } Im obigen Beispiel wird die Destrukturierungszuweisung verwendet, um a, b, c, e und f in Daten im Voraus den entsprechenden Variablen a, b, c, e und f zuzuweisen. Anschließend kann über diese Variablen in den berechneten Eigenschaften auf Daten zugegriffen werden, ohne die Abhängigkeitssammlung der entsprechenden Daten in Daten auszulösen. Auf diese Weise werden die Daten in den Daten nur einmal gelesen und die Abhängigkeitssammlung nur einmal ausgelöst. Dadurch werden Leistungsprobleme vermieden, die durch wiederholte Abhängigkeitssammlung verursacht werden.
Verarbeiten Sie die von der v-for-Schleife verwendeten Daten im Voraus und lesen Sie in der v-for-Schleife keine Array- oder Objekttypdaten. Im obigen Beispiel des Missbrauchs in der Vorlagenvorlage kann es wie folgt optimiert werden. Vorausgesetzt, dass es sich bei Liste, arr und obj um vom Server zurückgegebene Daten handelt und dass arr und obj bei der Darstellung in keinem Modul verwendet werden, können sie auf diese Weise optimiert werden. Vor der Optimierung: <Vorlage> <div Klasse="wrap"> <div v-for=Element in Liste> <div> {{ arr[item.index]['name'] }} </div> <div> {{ obj[item.id]['Alter'] }} </div> </div> </div> </Vorlage> Nach der Optimierung: <Vorlage> <div Klasse="wrap"> <div v-for=Element in Listendaten> <div{{item.name}} </div> <div>{{item.age}}</div> </div> </div> </Vorlage> <Skript> const arr = []; const obj = {} Standard exportieren { Daten() { zurückkehren { Liste: [], } }, berechnet: { listData: Funktion ({list}) { Liste.fürJeden(Element => { Artikel.name = arr[Artikel.index].name; Artikel.Alter = obj[Artikel-ID].Alter; }) Liste zurückgeben; } }, } </Skript> Oben sind die Details beschrieben, wie Sie den Missbrauch dieser Funktion zum Lesen von Daten in Vue vermeiden können. Weitere Informationen zum Vermeiden des Missbrauchs dieser Funktion in Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Lösung für die geringe Schreibeffizienz von unter AIX gemountetem NFS
>>: So aktualisieren Sie MySQL 5.6 auf 5.7 unter Windows
In diesem Artikelbeispiel wird der spezifische Co...
Umfeld Hostname IP-Adresse Aufschlag Jenkins 192....
Inhaltsverzeichnis Vorwort 1. Eine Zeichenfolge t...
Dabei wird das Bild als Hintergrund verwendet und...
In diesem Artikel erfahren Sie, wie Sie mit Vue d...
Ich bin heute auf ein Problem gestoßen: Kann ich ...
Inhaltsverzeichnis uni-app Einführung HTML-Teil j...
1. Einleitung Ich habe zuvor einen Artikel geschr...
Für die Installation von Docker auf CentOS muss d...
<br /> Dieser Artikel wurde von Rachel Golds...
Inhaltsverzeichnis Grundlegende Beschreibung AST-...
Inhaltsverzeichnis Weiterleitungsproxy Nginx-Reve...
Inhaltsverzeichnis Zum Beispiel: Allgemeines Schr...
Wenn Sie einer Option das Attribut selected = &quo...
Erstellen eines zweidimensionalen Arrays in Js: Z...