Zusammenfassung der Fähigkeiten zur Verwendung von Diff-Algorithmen
Dieses Mal werde ich Ihnen eine Zusammenfassung der Techniken zur Verwendung des Diff-Algorithmus geben. Was sind die Vorsichtsmaßnahmen bei der Verwendung des Diff-Algorithmus?
Virtueller Dom
Der Diff-Algorithmus muss zunächst das Konzept klären, dass das Objekt von Diff der virtuelle Dom ist und die Aktualisierung des realen Doms das Ergebnis des Diff-Algorithmus ist
Vnode-Basisklasse
constructor ( 。。。 ) { this.tag = tag this.data = data this.children = children this.text = text this.elm = elm this.ns = undefined this.context = context this.fnContext = undefined this.fnOptions = undefined this.fnScopeId = undefined this.key = data && data.key this.componentOptions = componentOptions this.componentInstance = undefined this.parent = undefined this.raw = false this.isStatic = false this.isRootInsert = true this.isComment = false this.isCloned = false this.isOnce = false this.asyncFactory = asyncFactory this.asyncMeta = undefined this.isAsyncPlaceholder = false }
Dieser Teil des Codes dient hauptsächlich dazu, die Bedeutung des Attributs des spezifischen Diff im Diff besser zu verstehen Algorithmus. Natürlich kann es auch besser sein, die Vnode-Instanz zu verstehen
Der Gesamtprozess
Die Kernfunktion ist die Patch-Funktion
isUndef-Urteil (ob es undefiniert oder null ist)
-
// leerer Mount (wahrscheinlich als Komponente), neues Root-Element erstellencreateElm(vnode, insertedVnodeQueue) Hier finden Sie das Das Erstellen von Knoten wird nicht einzeln eingefügt, sondern in eine Warteschlange für die einheitliche Stapelverarbeitung gestellt Vergleichsfunktion, die den Schlüssel und das Tag zweier Knoten direkt vergleicht, Daten vergleicht (beachten Sie, dass sich Daten hier auf VNodeData beziehen) und Typen für die Eingabe direkt vergleicht.
function sameVnode (a, b) { return ( a.key === b.key && ( ( a.tag === b.tag && a.isComment === b.isComment && isDef(a.data) === isDef(b.data) && sameInputType(a, b) ) || ( isTrue(a.isAsyncPlaceholder) && a.asyncFactory === b.asyncFactory && isUndef(b.asyncFactory.error) ) ) ) }
Nach dem Login kopierenDadurch wird bestätigt, ob die beiden Knoten einen weiteren Vergleichswert haben, andernfalls werden sie direkt ersetzt -
Der Ersetzungsprozess ist hauptsächlich eine createElm-Funktion und die andere besteht darin, den oldVNode zu zerstören
export interface VNodeData { key?: string | number; slot?: string; scopedSlots?: { [key: string]: ScopedSlot }; ref?: string; tag?: string; staticClass?: string; class?: any; staticStyle?: { [key: string]: any }; style?: object[] | object; props?: { [key: string]: any }; attrs?: { [key: string]: any }; domProps?: { [key: string]: any }; hook?: { [key: string]: Function }; on?: { [key: string]: Function | Function[] }; nativeOn?: { [key: string]: Function | Function[] }; transition?: object; show?: boolean; inlineTemplate?: { render: Function; staticRenderFns: Function[]; }; directives?: VNodeDirective[]; keepAlive?: boolean; }
Nach dem Login kopierenEinfügen Um den Prozess zu vereinfachen, müssen Sie den Typ des Knotens bestimmen und
createComponent aufrufen (es ermittelt, ob Kinder vorhanden sind, und ruft es dann rekursiv auf)
createComment
createTextNode
nach der Erstellung Nachdem Sie die Einfügefunktion
verwendet haben, müssen Sie die Hydrate-Funktion verwenden, um den virtuellen Dom und den realen Dom abzubilden
// destroy old node if (isDef(parentElm)) { removeVnodes(parentElm, [oldVnode], 0, 0) } else if (isDef(oldVnode.tag)) { invokeDestroyHook(oldVnode) }
Kernfunktion
function insert (parent, elm, ref) { if (isDef(parent)) { if (isDef(ref)) { if (ref.parentNode === parent) { nodeOps.insertBefore(parent, elm, ref) } } else { nodeOps.appendChild(parent, elm) } } }
Vergleichen Sie, ob die beiden Referenzen konsistent sind
Ich weiß nicht, was asyncFactory danach macht, also kann ich es nicht Verstehen Sie diesen Vergleich
Statischer Knotenvergleichsschlüssel, danach wird kein erneutes Rendern durchgeführt, kopieren Sie direkt die KomponenteInstanz (sobald der Befehl hier wirksam wird)
-
Wenn vnode ein Textknoten oder ein
Kommentarknoten ist, aber wenn vnode.text != oldVnode.text ist, müssen Sie nur den Textinhalt von vnode.elm - Vergleich der untergeordneten Knoten
- Wenn nur oldVnode untergeordnete Knoten hat, dann löschen Sie diese Knoten
- Wenn nur vnode hat untergeordnete Knoten. Wenn oldVnode ein Textknoten ist, legen Sie den Text von vnode.elm auf eine leere Zeichenfolge
- fest , updateChildren wird aktualisiert.
updateChildren
- Der Fokus dieses Teils liegt immer noch auf dem gesamten AlgorithmusErste vier Zeiger, oldStart, oldEnd, newStart, newEnd, zwei Arrays, oldVnode, Vnode .
function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) { if (oldVnode === vnode) { return } const elm = vnode.elm = oldVnode.elm if (isTrue(oldVnode.isAsyncPlaceholder)) { if (isDef(vnode.asyncFactory.resolved)) { hydrate(oldVnode.elm, vnode, insertedVnodeQueue) } else { vnode.isAsyncPlaceholder = true } return } if (isTrue(vnode.isStatic) && isTrue(oldVnode.isStatic) && vnode.key === oldVnode.key && (isTrue(vnode.isCloned) || isTrue(vnode.isOnce)) ) { vnode.componentInstance = oldVnode.componentInstance return } let i const data = vnode.data if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) { i(oldVnode, vnode) } const oldCh = oldVnode.children const ch = vnode.children if (isDef(data) && isPatchable(vnode)) { for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode) if (isDef(i = data.hook) && isDef(i = i.update)) i(oldVnode, vnode) } if (isUndef(vnode.text)) { if (isDef(oldCh) && isDef(ch)) { if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly) } else if (isDef(ch)) { if (isDef(oldVnode.text)) nodeOps.setTextContent(elm, '') addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue) } else if (isDef(oldCh)) { removeVnodes(elm, oldCh, 0, oldCh.length - 1) } else if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, '') } } else if (oldVnode.text !== vnode.text) { nodeOps.setTextContent(elm, vnode.text) } if (isDef(data)) { if (isDef(i = data.hook) && isDef(i = i.postpatch)) i(oldVnode, vnode) } }
Die Bedingung dafür, dass die gesamte Schleife nicht endet oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx
oldStart = == newStart, oldStart++ newStart++oldEnd === newEnd, oldEnd-- newEnd--- oldStart === newEnd, oldStart is am Ende der Warteschlange eingefügt oldStart++ newEnd--
- oldEnd === newStart, oldEnd wird am Anfang der Warteschlange oldEnd-- newStart++<🎜 eingefügt > Dies ist die einfache Möglichkeit, alle verbleibenden Situationen zu bewältigen. Nach der Verarbeitung gibt es newStart++
newStart在old中发现一样的那么将这个移动到oldStart前
没有发现一样的那么创建一个放到oldStart之前
循环结束后并没有完成
还有一段判断才算完
if (oldStartIdx > oldEndIdx) { refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue) } else if (newStartIdx > newEndIdx) { removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx) }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonZusammenfassung der Fähigkeiten zur Verwendung von Diff-Algorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Zusammenfassung der Funktion system() unter Linux Im Linux-System ist die Funktion system() eine sehr häufig verwendete Funktion, mit der Befehlszeilenbefehle ausgeführt werden können. In diesem Artikel wird die Funktion system() ausführlich vorgestellt und einige spezifische Codebeispiele bereitgestellt. 1. Grundlegende Verwendung der Funktion system() Die Deklaration der Funktion system() lautet wie folgt: intsystem(constchar*command);

Im Bereich des modernen Finanzwesens ist die quantitative Finanzierung mit dem Aufkommen der Datenwissenschaft und der Technologie der künstlichen Intelligenz nach und nach zu einer immer wichtigeren Richtung geworden. Als statisch typisierte Programmiersprache, die Daten effizient verarbeiten und verteilte Systeme bereitstellen kann, hat die Go-Sprache im Bereich der quantitativen Finanzen nach und nach Aufmerksamkeit erregt. In diesem Artikel wird die Verwendung der Go-Sprache zur Durchführung quantitativer Finanzanalysen vorgestellt. Der spezifische Inhalt ist wie folgt: Finanzdaten erhalten Zuerst müssen wir Finanzdaten erhalten. Die Netzwerkprogrammierfunktionen der Go-Sprache sind sehr leistungsfähig und können zum Abrufen verschiedener Finanzdaten verwendet werden. Vergleichen

Mit dem Aufkommen von Big Data und Data Mining unterstützen immer mehr Programmiersprachen Data Mining-Funktionen. Als schnelle, sichere und effiziente Programmiersprache kann die Go-Sprache auch für das Data Mining verwendet werden. Wie nutzt man also die Go-Sprache für das Data Mining? Hier sind einige wichtige Schritte und Techniken. Datenerfassung Zunächst müssen Sie die Daten beschaffen. Dies kann auf verschiedene Weise erreicht werden, z. B. durch das Crawlen von Informationen auf Webseiten, die Verwendung von APIs zum Abrufen von Daten, das Lesen von Daten aus Datenbanken usw. Die Go-Sprache verfügt über umfangreiches HTTP

Wie man mit PHP einfache SEO-Optimierungsfunktionen entwickelt SEO (SearchEngineOptimization) oder Suchmaschinenoptimierung bezieht sich auf die Verbesserung des Rankings der Website in Suchmaschinen durch Verbesserung der Struktur und des Inhalts der Website, wodurch mehr organischer Traffic erzielt wird. Wie kann man bei der Website-Entwicklung mit PHP einfache SEO-Optimierungsfunktionen implementieren? In diesem Artikel werden einige häufig verwendete SEO-Optimierungstechniken und spezifische Codebeispiele vorgestellt, um Entwicklern bei der Implementierung der SEO-Optimierung in PHP-Projekten zu helfen. 1. Freundliche Nutzung

So schreiben Sie mit C# den Minimum-Spanning-Tree-Algorithmus. Der Minimum-Spanning-Tree-Algorithmus ist ein wichtiger Algorithmus der Graphentheorie, der zur Lösung des Konnektivitätsproblems von Graphen verwendet wird. In der Informatik bezeichnet ein minimaler Spannbaum einen Spannbaum eines zusammenhängenden Graphen, bei dem die Summe der Gewichte aller Kanten des Spannbaums am kleinsten ist. In diesem Artikel wird erläutert, wie Sie mit C# den Minimal-Spanning-Tree-Algorithmus schreiben, und es werden spezifische Codebeispiele bereitgestellt. Zuerst müssen wir eine Diagrammdatenstruktur definieren, um das Problem darzustellen. In C# können Sie eine Adjazenzmatrix zur Darstellung eines Diagramms verwenden. Eine Adjazenzmatrix ist ein zweidimensionales Array, in dem jedes Element dargestellt wird

Mit der Popularität des Internets bieten immer mehr Websites externe Linkfunktionen für Bilder, Videos und andere Ressourcen. Diese externe Linkfunktion kann jedoch leicht gestohlen werden. Hotlinking bedeutet, dass andere Websites Bilder, Videos und andere Ressourcen auf Ihrer Website verwenden, um diese Ressourcen über die Referenzadresse direkt auf ihrer eigenen Website anzuzeigen, anstatt sie auf ihren eigenen Server herunterzuladen. Auf diese Weise können Hotlink-Websites den Datenverkehr und die Bandbreitenressourcen Ihrer Website kostenlos nutzen, was Ressourcen verschwendet und die Website-Geschwindigkeit beeinträchtigt. Um dieses Problem zu lösen, kann Nginx verwendet werden, um Hotlinking zu verhindern. Nginx ist

Ein-Klick-Lösung: Beherrschen Sie schnell die Verwendungsfähigkeiten der Pip-Spiegelquelle. Einführung: Pip ist das am häufigsten verwendete Paketverwaltungstool für Python, mit dem Python-Pakete einfach installiert, aktualisiert und verwaltet werden können. Aus bekannten Gründen ist die Verwendung der Standard-Spiegelquelle zum Herunterladen des Installationspakets jedoch langsamer. Um dieses Problem zu lösen, müssen wir eine inländische Spiegelquelle verwenden. In diesem Artikel wird erläutert, wie Sie die Verwendungsfähigkeiten von Pip Mirror Source schnell beherrschen, und es werden spezifische Codebeispiele bereitgestellt. Bevor Sie beginnen, machen Sie sich mit dem Konzept der Pip-Spiegelquelle vertraut.

Unter Linux ist es sehr schwierig, den Befehl svndiff direkt zum Anzeigen von Codeänderungen zu verwenden. Daher habe ich im Internet nach einer besseren Lösung gesucht, nämlich die Verwendung von vimdiff als Tool zum Anzeigen von Code für svndiff, insbesondere für diejenigen, die daran gewöhnt sind vim. Es ist sehr praktisch. Wenn Sie den Befehl svndiff zum Vergleichen der Änderungen einer bestimmten Datei verwenden und beispielsweise den folgenden Befehl ausführen: $svndiff-r4420ngx_http_limit_req_module.c, wird der folgende Befehl tatsächlich an das Standard-Diff-Programm gesendet: -u-Lngx_http_limit_req_module.c (revision4420)-Lngx_
