了解diff算法前我们需要先了解什么是Virtual
一.什么是Virtual DOM(虚拟DOM)
Virtual DOM(虚拟DOM)是Real DOM(真实DOM)的JS对象 我们看下图方便理解
(不会画图 只能借鉴一下了)
虚拟DOM 就把是 真实DOM的 标签名和标签属性和子标签以及文本节点 都以js的对象的样式呈现
二.了解diff算法
diff算法(个人简单理解):diff算法会将 新的虚拟DOM 和 旧的虚拟DOM 进行对比 找出差异 将差异封装为补丁(如果存在无差异的虚拟节点,旧虚拟节点将会得到复用),通过方法的循环遍历然后打到 真实DOM 上,以差异化最小的代价去操作DOM,
先上图
图中标注的真实DOM对应右边虚拟DOM
一旦我改变真实DOM的文本内容 就会生成一个新的虚拟DOM(切记如果修改真实DOM文本后 就会立即执行deff算法 以最小化进行更新视图)
diff算法本质就是找出新旧虚拟DOM的差异然后最小化的对视图进行更新
1.数据改变就会触发deff算法中setter方法 间接触发Dep.notify方法 然后通知到各使用方执行patch方法(patch方法就是比较新旧虚拟节点的差异 将差异包装成一个补丁 然后打在真实DOM所需要的地方)
2.首先执行isSameVnode判断这两个是否为同类标签如果不是同类标签则直接替换
3.如果是同类标签则执行patchVonde方法 先判断是新旧虚拟节点是否相同 相同则直接return
4.如果新旧虚拟节点不同 则分为4中情况 如图左侧所示
5.当oldvnode和newvnode都有子节点时 就会执行updataChildren updataChildren 使用同级比对 在同级比对时会采用首位指针法来对比子节点 每次oldvnode和newvnode子节点比对成功时 真实DOM的节点 以newvnode的子节点排序为标准 都会对真实DOM的节点进行操作 然后渲染到页面中(如下图这 这也就相当执行了大概4次DOM操作 3次innerText操作 1次creat和append的DOM操作 如果想减少DOM操作 那么我们就要用到key值操作了 key值操作我们下章再讲)
本笔记在该观看此视频获取灵感之后创作 可以点击进行观看