讲讲Vue diff算法
diff算法就是进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方,最后用patch记 录的消息去局部更新Dom。
特点:
- 比较只会在同层级进行, 不会跨层级比较
- 在diff比较的过程中,循环从两边向中间比较
步骤:
- 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文 档当中
- 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较(diff),记录两棵树差异
- 把第二棵树所记录的差异应用到第一棵树所构建的真正的DOM树上(patch),视图就更新了
1:patch函数中对新老节点比较
如果新节点不存在,就销毁老节点
如果老节点不存在就创建新节点
新老节点相同就进入patchVnode比较节点内部
2:patchVnode比较节点内部,如果相同则返回Vnode的children
再分情况:
有新children,没有旧children,创建新的
有旧children,没有新children,删除旧的
新旧都有,执行updateChildren比较children差异
这里就是diff算法核心,当前vnode的children为textnode,更新到text
3;updateChildren函数子节点比较
1:头头比较,相似,则新旧头指针后移,真实dom不变,进入下一次循环,不相似.进入2步
2:尾尾比较,相似,则新旧尾指针前移,真实dom不变,进入下一次循环,不相似,进入3步
3:头尾比较,相似,旧头指针后移,新尾指针前移,未确认dom序列中的头移到尾,进入下一次循环,不相似,进入4步
4:尾头比较,相似,旧尾指针前移,新头指针后移,未确认dom序列中的尾移到头,进入下一次循环,不相似,进入5步
5:若节点中的key在旧子节点中找到samevnode(tag和key都一致),则将其dom移到真实dom序列的头部,新头指针后移,否则vnode的dom插入到真实dom头部,新头指针后移
当循环结束后有两种情况考虑:
新的子节点数组被遍历完,将多余的旧dom删除;
旧的子节点数组被便利完,将多余的新dom添加
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能