浅析 v-node

article/2025/11/6 20:46:09

浅析 v-node

🌈 本节我们来探索一下虚拟DOM,将会从以下4个方面进行阐述:

  1. 虚拟DOM的本质
  2. 虚拟DOM的优势
  3. 虚拟DOM转换真实DOM 过程
  4. 虚拟DOM树 diff算法

虚拟DOM的本质

⭐️虚拟DOM 本质上是一个 js 对象,用于描述页面的结构,在 Vue 中,每个组件都有一个render函数,每一个 render 函数运行会返回一棵虚拟DOM树

打印一下虚拟DOM👇
vnode

虚拟DOM的优势

  1. 当组件的 依赖数据 变化时,该组件需要重新渲染,去重新运行render函数,得到一棵新的虚拟DOM树,将新旧两棵树进行对比,通过 patch 算法,做到最小量更新。
  2. 如果每次渲染去对真实DOM的创建、更新、插入是非常消耗性能的,降低渲染效率,用虚拟DOM代替真实DOM,解决了渲染效率的问题。

虚拟DOM转换真实DOM 过程

  1. 当组件首次渲染时,它会先生成虚拟DOM树,然后根据虚拟DOM树创建真实DOM,并把真实DOM挂载到页面中合适的位置,此时,每个虚拟DOM便会对应一个真实的DOM。(首次渲染,虚拟DOM优势不是很大,比操作真实DOM多了一个构建虚拟DOM树的过程,在后续更新过程中,优势变得更大。)
  2. 如果组件不是首次渲染,依赖数据发生变化,则需要重新渲染,重新调用render函数,创建出一个新的虚拟DOM树,用新树和旧树对比,通过内部patch函数,vue会找到最小更新量,然后更新必要的虚拟DOM节点,最后,这些更新过的虚拟节点,会去修改它们对应的真实DOM,做一些属性上的更新,保证了树的稳定和最小量更新。

虚拟DOM树 diff 算法

  1. diff发生的时机

    是在组件实例创建时,以及依赖的属性或数据变化时,会运行一个函数,该函数会做两件事:

    • 运行_render生成一棵新的虚拟dom树(vnode tree)
    • 运行_update,传入虚拟dom树的根节点,对新旧两棵树进行对比,最终完成对真实dom的更新

    核心代码如下:

    // vue构造函数
    function Vue(){// ... 其他代码var updateComponent = () => {this._update(this._render())}// ... 其他代码
    }
    

    diff就发生在_update函数的运行过程中

  2. _update函数在干什么

    _update函数接收到一个vnode参数,这就是生成的虚拟dom树

    同时,_update函数通过当前组件的_vnode属性,拿到的虚拟dom树

    _update函数首先会给组件的_vnode属性重新赋值,让它指向新树

    然后会判断旧树是否存在:

    • 不存在:说明这是第一次加载组件,于是通过内部的patch函数,直接遍历新树,为每个节点生成真实DOM,挂载到每个节点的elm属性上

    • 存在:说明之前已经渲染过该组件,于是通过内部的patch函数,对新旧两棵树进行对比,以达到下面两个目标:

      • 完成对所有真实dom的最小化处理
      • 让新树的节点对应合适的真实dom
  3. patch函数的对比流程

    1. 相同:是指两个虚拟节点的标签类型、key值均相同,但input元素还要看type属性,具体实现如下👇:
    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))))
    }
    function sameInputType (a, b) {if (a.tag !== 'input') return truelet iconst typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.typeconst typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.typereturn typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)
    } 
    
    1. 新建元素:根据一个虚拟节点提供的信息,创建一个真实dom元素,并且挂载到该虚拟节点的elm属性上
       fucntion create(){// 其他代码... // ns 表示 namespacevnode.elm = vnode.ns? nodeOps.createElementNS(vnode.ns, tag): nodeOps.createElement(tag, vnode)}
    
    1. 销毁元素:通过vnode.elm.remove()方法进行销毁
    2. 更新:两个虚拟节点进行对比更新,它仅发生在两个虚拟节点相同的情况下,做一些属性的更新
    3. 对比子节点:两个虚拟节点的子节点进行对比
    function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {// 为新旧两棵树分别创建首位两个指针,遍历的同时做 删除和新建操作let oldStartIdx = 0 let newStartIdx = 0let oldEndIdx = oldCh.length - 1let newEndIdx = newCh.length - 1// 首先判断 key值,tag类型,再做相应的 创建 删除 更新操作// 其他代码....}
    

    diff过程:

    1. 根节点对比
      patch函数先对根节点进行对比
      如果两个节点
    • 相同,则进入更新流程
      1. 将旧节点的真实dom赋值到新节点:newVnode.elm = oldVnode.elm
      2. 对比新节点和旧节点的属性,有变化的更新到真实dom中
      3. 当前两个节点处理完毕,开始对比子节点
    • 不相同
      ⭐️ vue会认为这是两棵不一样的树,直接旧树不要,根据新树创建元素
      1. 新节点递归 新建元素
      2. 旧节点销毁元素
    1. 对比子节点

    对比子节点时,vue一切的出发点,都是为了最小量更新,尽量做到只是元素的移动,属性的更新,实在不行只能新建和删除元素。


http://chatgpt.dhexx.cn/article/D12OgJs6.shtml

相关文章

deepwalknode2vec 代码实战

提示:笔记内容来自于B站up主同济子豪兄 文章目录 1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入?2.2. deepwalk的步骤1、生成graph;2、利用random walk生成多个路径;3、训练表示向量的学习;4、为了解决分类个数…

Node2Vec

Node2Vec 论文名称:node2vec: Scalable Feature Learning for Networks 论文地址:https://www.kdd.org/kdd2016/papers/files/rfp0218-groverA.pdf Node2Vec是用于学习网络节点的连续特征表示。node2vec将节点映射为低维特征表示,最大化网…

node2vec python 实现和理解

1. 安装 pip install node2vec 2. 使用案例 import networkx as nx from node2vec import Node2Vec# Create a graph 这里可以给出自己的graph graph nx.fast_gnp_random_graph(n100, p0.5)# Precompute probabilities and generate walks - **ON WINDOWS ONLY WORKS WITH …

node2vec的一些理解

node2vec node2vec也是一种网络嵌入的表示方法,它是基于DeepWalk的基础上进行改进的。主要改进的地方在于它在随机游走的过程中加入了一个权重,使得游走可以采用深度优先和广度优先的策略进行游走。 Search bias α 使得随机游走产生片偏差的最简单的…

从word2vec到node2vec

word2vec 1. 什么是word2vec 在自然语言处理任务(NLP)中,最细粒度是词语,所以处理NLP问题,首先要处理好词语。 由于所有自然语言中的词语,都是人类的抽象总结,是符号形式的。而对于数学模型&a…

详解Node2vec以及优缺点

1. 论文介绍 首先介绍了复杂网络面对的几种任务: 网络节点的分类,通俗点说就是将网络中的节点进行聚类,我们关心的是哪些节点具有类似的属性,就将其分到同一个类别中。链接预测,就是预测网络中哪些顶点有潜在的关联。…

node2vec论文阅读

本文要阅读的论文来自数据挖掘领域的顶级会议KDD-2016. 论文介绍了一种Graph representation方法 得益于CNN以及Seq2seq等模型,深度学习在图像和自然语言处理等领域有很好的应用。然而在涉及到图(有向图,无向图)结构的应用比如社…

【Graph Embedding】node2vec:算法原理,实现和应用

前面介绍过基于DFS邻域的DeepWalk和基于BFS邻域的LINE。 DeepWalk:算法原理,实现和应用 LINE:算法原理,实现和应用 node2vec是一种综合考虑DFS邻域和BFS邻域的graph embedding方法。简单来说,可以看作是eepwalk的一…

图与推荐系统(一):Graph Embedding之node2vec (原理 + 代码实战)

文章目录 一. 介绍二. 公式三. 代码细节四. 代码 一. 介绍 node2vec是一种综合考虑DFS邻域和BFS邻域的graph embedding方法。简单来说,可以看作是deepwalk的一种扩展,是结合了DFS和BFS随机游走的deepwalk。node2vec通过调整方向的参数来控制模型更倾向B…

图神经网络之Node2Vec详解

目录 背景传统算法存在的问题算法背景动机 算法随机序列的生成Node2Vec算法算法的具体流程: 总结相关资料 背景 传统算法存在的问题 一些方法中所提出的特征需要依赖人手工定义,这需要特定领域内专业人士来完成,而且依靠人手工定义特征的有…

node2vec算法

图嵌入算法 一、背景1.提出2.应用3.特点 二、DeepWalkRandomWalk 三、node2vec引言node2walkskip-gram(用中心词预测周围词) 一、背景 1.提出 ①使用邻接矩阵表示网络时,由于矩阵中大多数元素是0,难以体现节点间关系,同时数据的稀疏性使得计…

node2vec代码实现及详细解析

目录 前言1.数据导入2.node2vecWalk2.1 归一化转移概率2.1.1 原理解析2.1.2 Alias采样2.1.3 代码实现 2.2 node2vecWalk的实现 3.LearnFeatures4.参数选择5.完整代码 前言 在KDD 2016 | node2vec:Scalable Feature Learning for Networks 中我们详细讨论了node2vec…

Node2vec原理剖析,代码实现

DeepWalk原理介绍 与词嵌入类似,图嵌入基本理念是基于相邻顶点的关系,将目的顶点映射为稠密向量,以数值化的方式表达图中的信息,以便在下游任务中运用。 Word2Vec根据词与词的共现关系学习向量的表示,DeepWalk受其启…

Python(Pycharm)常用快捷键

1. Pycharm一键给所有代码加# CtrlA或者Ctrl/ 2. Pycharm格式化代码快捷键(即标准化) CtrlAltL 【注】qq也可能有此快捷键,把qq删掉就行 其实改掉Pycharm的里面的设置也可以(这样就不会冲突了) add keyboard shor…

python 中常见的快捷方式

相信大家在写代码的时候经常会用到快捷键,这不仅使编写代码的效率提高不少,还能装 X...下面整理了部分常见快捷键,后期会接着更新。废话不多说: 1.ctrlshiftA:万能命令行 可以新建一个python文件 2. shift两次:查看资源文件 3…

python的快捷键总结

电脑是解决众多问题的工具,尤其对于程序员而言,拥有一套快捷方式,在编程时,可以事半功倍,从而高效地完成工作任务,今天就带来一套快捷方式,仅供大家参考: 常见快捷方式: …

Python快捷键

1.注释(添加/消除)(Ctrl /) 这里说下Python的单行注释是 # , 多行注释是 注释内容 , java的单行注释是 // , 多行注释 /* 注释内容 */, 文档注释 /** 注释内容 */ 这里说的注释快捷键主要用于多行注释, 当你想把一段代码暂时注释掉的时候, 可以直接选中这段代码, 利用此快…

python 常用快捷键和设置

pycharm常用快捷键 转载自 大哥 1、编辑(Editing) Ctrl Space 基本的代码完成(类、方法、属性) Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息(在方法中调用参数&#…

Python常用快捷键整理

Python常用快捷键整理 文章目录 Python常用快捷键整理一、注释二、删除三、格式四、 查看其它1. 代码自动整理 本文列举了常用的快捷键,暂时刚入门,还没有写太多,如有不足之处还请多多指教。 一、注释 行注释/取消行注释: Ctrl / 多行注释&…

python常用快捷键

一、编辑(Editing) Ctrl Space 基本的代码完成(类、方法、属性) Ctrl Alt Space 快速导入任意类 Ctrl Shift Enter 语句完成 Ctrl P 参数信息(在方法中调用参数) Ctrl Q 快速查看文档 F1 外部文档 S…