Heim WeChat-Applet Mini-Programmentwicklung Das Objekt von Diff ist ein virtueller Dom

Das Objekt von Diff ist ein virtueller Dom

Apr 08, 2018 pm 05:55 PM
diff 虚拟

Das Diff-Objekt, das ich Ihnen dieses Mal vorstelle, ist das virtuelle Dom-Objekt sehen. 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

Dieser Teil des Codes dient hauptsächlich dazu, die Bedeutung des Attributs

des spezifischen Diff-Ins besser zu verstehen Der Diff-Algorithmus kann natürlich auch geändert werden.
 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
 }
Nach dem Login kopieren

Der Gesamtprozess

Die Kernfunktion ist die Patch-Funktion

isUndef-Urteil (ob undefiniert oder null)

  • // Mount leeren (wahrscheinlich als Komponente), neues Root-Element erstellencreateElm(vnode, insertedVnodeQueue) Hier Sie können feststellen, dass beim Erstellen von Knoten nicht ein einzelner Knoten eingefügt wird, sondern ein

    Einheitliche Stapelverarbeitung in der Warteschlange
  • Kernfunktion sameVnode

  • Hier ist eine äußere Vergleichsfunktion, die direkt verglichen werden kann. Der Schlüssel, das Tag (Label) und die Daten der beiden Knoten werden verglichen (beachten Sie, dass sich die Daten hier auf VNodeData beziehen) und der Typ ist direkt zur Eingabe verglichen.
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 kopieren
Dadurch wird bestätigt, ob die beiden Knoten einen weiteren Vergleich wert sind, andernfalls werden sie direkt ersetzt.

Der Ersetzungsprozess ist hauptsächlich eine createElm-Funktion und der andere die Zerstörung von oldVNode
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 kopieren

Der Einfügungsprozess besteht einfach darin, den Typ des Knotens zu bestimmen und

createComponent aufzurufen (es ermittelt, ob Kinder vorhanden sind, und ruft es dann rekursiv auf)
// destroy old node
    if (isDef(parentElm)) {
     removeVnodes(parentElm, [oldVnode], 0, 0)
    } else if (isDef(oldVnode.tag)) {
     invokeDestroyHook(oldVnode)
    }
Nach dem Login kopieren

createComment

createTextNode

Verwenden Sie nach der Erstellung die Einfügefunktion

Danach müssen Sie die Hydrate-Funktion verwenden, um den virtuellen Dom und den realen Dom abzubilden

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)
   }
  }
 }
Nach dem Login kopieren

const el = vnode.el = oldVnode.el Dies ist ein sehr wichtiger Schritt. Lassen Sie vnode.el auf den aktuellen Real verweisen dom. Wenn el geändert wird, ändert sich vnode.el synchron.

 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, &#39;&#39;)
    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, &#39;&#39;)
   }
  } 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)
  }
 }
Nach dem Login kopieren

Vergleichen Sie, ob die beiden Referenzen konsistent sind
  1. Ich weiß nicht, was asyncFactory danach macht, also kann ich es nicht Verstehen Sie diesen Vergleich

  2. Statischer
  3. Knotenvergleichsschlüssel, es wird kein erneutes Rendern durchgeführt, wenn sie gleich sind, ComponentInstance wird direkt kopiert (sobald der Befehl hier wirksam wird). )
  4. Wenn vnode ein Textknoten oder Anmerkungsknoten ist, aber vnode.text != oldVnode.text, müssen Sie nur den Textinhalt von vnode.elm aktualisieren

  5. Vergleich der untergeordneten Knoten

  6. Wenn nur oldVnode untergeordnete Knoten hat, dann löschen Sie diese Knoten
  • Wenn nur vnode untergeordnete Knoten hat, dann erstellen Sie diese untergeordneten Knoten. Wenn oldVnode ein Textknoten ist, setzen Sie den Text von vnode.elm auf eine leere

    Zeichenfolge
  • Wenn beide sind verfügbar, updateChildren wird später detailliert beschrieben.

  • Wenn weder oldVnode noch vnode untergeordnete Knoten haben, oldVnode jedoch ein Textknoten oder Anmerkungsknoten ist, legen Sie den Text fest vnode.elm in einen leeren String

  • updateChildren

Der Fokus dieses Teils liegt immer noch auf dem gesamten AlgorithmusZuerst vier Zeiger, oldStart, oldEnd, newStart, newEnd, zwei Arrays, oldVnode, Vnode .

Mehrere Situationen und Verarbeitung eines Schleifenvergleichs (das folgende ++ – alle beziehen sich auf das ++ des Index –) Der Vergleich ist der zu vergleichende Knoten. Die Abkürzung ist nicht streng der Vergleich wird verwendet. Die Funktion sameVnode ist nicht wirklich kongruent

Die Bedingung dafür, dass die gesamte Schleife nicht endet oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx
function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
  let oldStartIdx = 0
  let newStartIdx = 0
  let oldEndIdx = oldCh.length - 1
  let oldStartVnode = oldCh[0]
  let oldEndVnode = oldCh[oldEndIdx]
  let newEndIdx = newCh.length - 1
  let newStartVnode = newCh[0]
  let newEndVnode = newCh[newEndIdx]
  let oldKeyToIdx, idxInOld, vnodeToMove, refElm
  while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
   if (isUndef(oldStartVnode)) {
    oldStartVnode = oldCh[++oldStartIdx] // Vnode has been moved left
   } else if (isUndef(oldEndVnode)) {
    oldEndVnode = oldCh[--oldEndIdx]
   } else if (sameVnode(oldStartVnode, newStartVnode)) {
    patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue)
    oldStartVnode = oldCh[++oldStartIdx]
    newStartVnode = newCh[++newStartIdx]
   } else if (sameVnode(oldEndVnode, newEndVnode)) {
    patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue)
    oldEndVnode = oldCh[--oldEndIdx]
    newEndVnode = newCh[--newEndIdx]
   } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
    patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue)
    canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm))
    oldStartVnode = oldCh[++oldStartIdx]
    newEndVnode = newCh[--newEndIdx]
   } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
    patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue)
    canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm)
    oldEndVnode = oldCh[--oldEndIdx]
    newStartVnode = newCh[++newStartIdx]
   } else {
    if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)
    idxInOld = isDef(newStartVnode.key)
     ? oldKeyToIdx[newStartVnode.key]
     : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)
    if (isUndef(idxInOld)) { // New element
     createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
    } else {
     vnodeToMove = oldCh[idxInOld]
     if (sameVnode(vnodeToMove, newStartVnode)) {
      patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue)
      oldCh[idxInOld] = undefined
      canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)
     } else {
      // same key but different element. treat as new element
      createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)
     }
    }
    newStartVnode = newCh[++newStartIdx]
   }
  }
  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)
  }
 }
Nach dem Login kopieren

oldStart === newStart, oldStart++ newEnd --

  1. oldEnd === newStart, oldEnd wird am Anfang der Warteschlange oldEnd-- newStart++

    eingefügt
  2. 剩下的所有情况都走这个处理简单的说也就两种处理,处理后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)
  }
Nach dem Login kopieren

简单的说就是循环结束后,看四个指针中间的内容,old数组中和new数组中,多退少补而已

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

JS的EventEmitter使用步奏详解

怎么用Vue导出excel表格功能

怎么在微信小程序里做出全局搜索代码高亮提醒

Das obige ist der detaillierte Inhalt vonDas Objekt von Diff ist ein virtueller Dom. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Microsoft Wi-Fi Direct Virtual Adapter: Was macht er? Microsoft Wi-Fi Direct Virtual Adapter: Was macht er? Jun 29, 2023 pm 12:33 PM

Sie fragen sich vielleicht, was der Microsoft Wi-Fi Direct Virtual Adapter auf Ihrem PC macht. Seien Sie besser versichert, dass dieser Netzwerkadapter von Microsoft stammt und absolut sicher ist. Wenn der Adapter Ihre Aktivitäten jedoch durcheinander bringt und Sie sich fragen, ob es sich lohnt, ihn aufzubewahren, finden Sie in diesem Leitfaden alles, was Sie wissen müssen. Was macht der virtuelle Microsoft Wi-Fi Direct-Adapter? Wie der Name schon sagt, hilft der Microsoft Wi-Fi Direct Virtual Adapter dabei, Ihren PC zu einem drahtlosen Hotspot zu machen. Auf diese Weise können andere Computer eine Verbindung zu Ihrem PC herstellen, um auf das Internet zuzugreifen. Dies geschieht durch die Virtualisierung drahtloser Netzwerkadapter. Auf diese Weise wird Ihr einzelner physischer WLAN-Adapter in zwei virtuelle umgewandelt

Der Quellcode von 25 KI-Agenten ist jetzt öffentlich, inspiriert von Stanfords „Virtual Town' und „Westworld' Der Quellcode von 25 KI-Agenten ist jetzt öffentlich, inspiriert von Stanfords „Virtual Town' und „Westworld' Aug 11, 2023 pm 06:49 PM

Zuschauer, die mit „Westworld“ vertraut sind, wissen, dass diese Show in einem riesigen High-Tech-Themenpark für Erwachsene in der Zukunftswelt spielt. Die Roboter haben ähnliche Verhaltensfähigkeiten wie Menschen und können sich an das erinnern, was sie sehen und hören, und die Kernhandlung wiederholen. Jeden Tag werden diese Roboter zurückgesetzt und in ihren Ausgangszustand zurückversetzt. Nach der Veröffentlichung des Stanford-Artikels „Generative Agents: Interactive Simulacra of Human Behavior“ ist dieses Szenario nicht mehr auf Filme und Fernsehserien beschränkt Szene in Smallvilles „Virtual Town“ 》Übersichtskarten-Papieradresse: https://arxiv.org/pdf/2304.03442v1.pdf

Ersetzen Sie svn diff durch vimdiff: ein Tool zum Vergleichen von Code Ersetzen Sie svn diff durch vimdiff: ein Tool zum Vergleichen von Code Jan 09, 2024 pm 07:54 PM

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_

Top 10 Tradingplattformen der virtuellen Währung im Cryptocurrency Circle 2025 Top 10 Tradingplattformen der virtuellen Währung im Cryptocurrency Circle 2025 Mar 12, 2025 pm 05:27 PM

Top 10 Währungsplattformen in der Kryptowährung von 2025: OKX, eine hohe Liquidität, eine geringe Gebühren und eine reichliche Binance; .

Das Klettern entlang des Netzwerkkabels ist zur Realität geworden, Audio2Photoreal kann durch Dialoge realistische Ausdrücke und Bewegungen erzeugen Das Klettern entlang des Netzwerkkabels ist zur Realität geworden, Audio2Photoreal kann durch Dialoge realistische Ausdrücke und Bewegungen erzeugen Jan 12, 2024 am 09:03 AM

Wenn Sie mit einem Freund über einen kalten Telefonbildschirm chatten, müssen Sie den Tonfall der anderen Person erraten. Wenn er spricht, können seine Ausdrücke und sogar seine Handlungen in Ihrem Kopf sichtbar werden. Natürlich wäre es am besten, wenn Sie einen Videoanruf tätigen könnten, aber unter tatsächlichen Umständen ist es zu keinem Zeitpunkt möglich, einen Videoanruf zu tätigen. Wenn Sie mit einem entfernten Freund chatten, geschieht dies nicht über einen kalten Bildschirmtext oder einen ausdruckslosen Avatar, sondern über eine realistische, dynamische und ausdrucksstarke digitale virtuelle Person. Diese virtuelle Person kann nicht nur das Lächeln, die Augen und sogar subtile Körperbewegungen Ihres Freundes perfekt reproduzieren. Werden Sie sich freundlicher und warmer fühlen? Es verkörpert wirklich den Satz „Ich werde am Netzwerkkabel entlang kriechen, um dich zu finden.“ Dabei handelt es sich nicht um eine Science-Fiction-Fantasie, sondern um eine Technologie, die in die Realität umgesetzt werden kann. Gesichtstisch

Welche virtuellen Münzen sollten auf Apple Phones heruntergeladen werden Welche virtuellen Münzen sollten auf Apple Phones heruntergeladen werden Feb 21, 2025 pm 05:57 PM

Virtuelle Währungsanwendungen sind zu einem wichtigen Instrument für moderne Investitionen und Finanzmanagement geworden. In diesem Artikel werden die Vor- und Nachteile der virtuellen Währungsanwendungen eingehend untersucht und konzentriert sich auf die besten Anwendungen, die Apple Mobile -Nutzern zur Verfügung stehen. Wir diskutieren die Funktionen, Sicherheitsmaßnahmen und Benutzererfahrungen dieser Apps, um den Lesern fundierte Entscheidungen zu treffen, um die besten virtuellen Währungs -Apps zu treffen, die ihren spezifischen Anforderungen entsprechen.

Regelmäßige Handels -App für virtuelle Währung Was sind die neuesten zehn Währungshandelsplattformen? Regelmäßige Handels -App für virtuelle Währung Was sind die neuesten zehn Währungshandelsplattformen? Feb 21, 2025 pm 09:09 PM

Dieser Artikel bietet eine umfassende Bewertung des weltweit führenden Kryptowährungsbörsens. OKX, Binance, Gate.io und Bitget sind ganz oben auf der Liste für ihre herausragenden Funktionen und Vorteile. OKX ist der weltweit größte Austausch mit niedrigen Handelsgebühren, fortschrittlichen Handelsinstrumenten und reichhaltigen Bildungsressourcen. Binance bietet eine breite Palette von Kryptowährungsauswahl- und Derivatdiensten. Gate.io ist bekannt für seine umfassenden Investitionstools und niedrigen Transaktionsgebühren. Bitget konzentriert sich auf Derivathandel und bietet flexible Handelsmechanismen und innovative Plattformen.

Können Sie Geld verdienen, indem Sie virtuelle Münzen abbilden? Ist es wahr? Können Sie Geld verdienen, indem Sie virtuelle Münzen abbilden? Ist es wahr? Mar 04, 2025 am 07:09 AM

Virtual Currency Mining: Chancen und Herausforderungen koexistieren im virtuellen Währungsabbau, dh Computeralgorithmen, um komplexe mathematische Probleme zu lösen, um virtuelle Währung zu erhalten. Mit zunehmender Bergbaukosten ist die Rentabilität jedoch stark in Frage gestellt. In diesem Artikel wird das Gewinnpotential des Mining Virtual Currency Mining und die Schlüsselfaktoren, die sich auf die Renditen auswirken, eingehend untersucht. Mining -Gewinnanalyse Mining erhält virtuelle Währungsbelohnungen, indem sie an der Computing und Überprüfung von Blockchain -Netzwerken teilnehmen. Mit dem Aufstieg von Technologien wie dem Cloud -Mining wurde der Schwellenwert für die Teilnahme gesenkt. Der Bergbau kann eine relativ stabile Einkommensquelle liefern, jedoch nur, wenn die Bergbaumaschine normal arbeitet und die Stromversorgung ausreicht. Darüber hinaus schwankt der Preis für virtuelle Währung dramatisch, was möglicherweise hohe Renditen erzielen und auch erzeugen kann

See all articles