首页 > 编程语言 >讲讲Vue diff算法

讲讲Vue diff算法

时间:2022-09-24 10:11:28浏览次数:50  
标签:Vue 讲讲 dom 节点 diff 比较 children 指针

diff算法就是进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方,最后用patch记 录的消息去局部更新Dom。

特点:

  1. 比较只会在同层级进行, 不会跨层级比较
  2. 在diff比较的过程中,循环从两边向中间比较

步骤:

  1. 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文 档当中
  2. 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较(diff),记录两棵树差异
  3. 把第二棵树所记录的差异应用到第一棵树所构建的真正的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添加

标签:Vue,讲讲,dom,节点,diff,比较,children,指针
From: https://www.cnblogs.com/qianduan-Wu/p/16725008.html

相关文章

  • 19道高频vue面试题,顺便写一下自己的答案
    Vue路由hash模式和history模式1.hash模式早期的前端路由的实现就是基于location.hash来实现的。其实现原理很简单,location.hash的值就是URL中#后面的内容。比如下......
  • Vue父子组件生命周期触发顺序是怎样的?
    挂载阶段父beforecreated->父created->父beforemounted->子beforecreated->子created->子beforemounted->子mounted->父mounted更新阶段父beforeUpdate->子beforeUpda......
  • 说说Vue的keep-alive使用及原理。
    keep-alive是vue.js的一个内置组件,它将不活动的组件保存在内存中,而非只讲将其销毁,提供了include(缓存),exclude(不缓存)两个属性,可以有选择的保存组件语法:<keep-al......
  • VUE v-bind 数据绑定
    动态的绑定一个或多个attribute,也可以是组件的prop。缩写: : 或者 . (当使用 .prop 修饰符)期望: any(带参数)|Object(不带参数)参数: attrOrProp(可选的)......
  • Vue2项目解决-js/css文件无法引用问题
    打包:    在vue.config.js文件中  const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({  transpileDependencies:t......
  • .NET 文件系统(七)--vue3.0文件系统搭建与配置(router配置)
    不过多介绍node安装与vue-cli安装配置,自行百度1.新建vite项目npminitvite@latest选择vue,选择ts即可生成依赖:npminstall启动项目:npmrundev2.路由(router)配置......
  • Vuex 学习笔记
    组件之间共享数据的方式小范围父向子:v-bind属性绑定简写:子向父:v-on事件绑定简写@兄弟组件之间共享数据:EventBusVuex是实现组件全局状态(数据)管理的一种机制,可......
  • Vue3与Vue2的区别(面试题)
    模板指令1、v-if、v-for优先级区别3.0依然不建议写在一个元素上但是依然可以同时绑定Vue2:当在同一个元素上使用v-if时,将优先v-forVue3:v-if优先,再v-for 2、v-model......
  • Vue组件递归渲染
    父级菜单  数据格式  子组件递归(直接使用name) ......
  • vue页面嵌套iframe页面传值、调用、首次传值获取不到、有缓存数据问题
    在父组件中创建iframe <!--iframe-->   <!-- --><el-dialog:visible.sync="dialogVisible"width="500px"@close="closeDialog"v-if="dialogVi......