一,vdom(virtual dom)
用js模拟dom结构,计算出最小的变更,操作dom
二,diff算法概述
1,diff即对比,是一个广泛的概念
2,两个js对象也可以做diff
3,两棵树做diff,如这里的vdom diff
三,树diff和vdom的diff
1,树diff的时间复杂度O(n^3)
1),遍历tree1,遍历tree2...
2),排序
3),1000个节点,要计算1亿次,算法不可用
2,vdom的diff算法,优化时间复杂度到O(n)
1),只比较同一层级,不跨级比较
2),tag不相同,则直接删掉重建,不再深度比较
3),tag和key,两者都相同,则认为是相同节点,不再深度比较
三,用js模拟DOM结构
js数据结构 html数据格式四,生成vnode(借鉴snabbdom.js)(h函数返回vnode)
VNode类 VNodeData数据格式1,最主要是属性:tag(比如:div,p,span)、data、children、key、text
2,VNode分为以下几类
1),TextVNode 文本节点。
2),ElementVNode 普通元素节点。
3),ComponentVNode 组件节点。
4),EmptyVNode 没有内容的注释节点。
5),CloneVNode 克隆节点,可以是以上任意类型的节点,唯一的区别在于isCloned属性为true
五,patch函数的diff算法将改变渲染到dom上(patch(elem,vnode)和patch(vnode,newVnode))
patch函数1,判断是否为vnode
判断标签是否存在2,创建一个空的vnode,关联到这个dom元素(Element)
创建空vnode3,比较vnode是否相同
比较vnode的key和标签4,patchVnode:这个函数做的事情是对传入的两个 vnode 做 diff,如果存在更新,将其反馈到 dom 上
patchVnode函数1),hooks:更新节点属性
2),updateChildren(https://juejin.im/post/5b9200865188255c672e8cfd)
1,新旧节点的开始和开始比较
2,新旧节点的结束和结束比较
3,新旧节点的开始和结束比较
4,新旧节点的结束和开始比较
5,新旧节点开始或者结束节点为空
6,比较新节点在旧节点中的key和tag(标签)
7,key的重要性(key使用固定的数值,不能使用随机数)
key使用和不使用的区别3),removeVnodes
removeVnodes函数4),addVnodes
addVnodes函数六,总结
1,vdom核心概念:h,vnode,patch,diff,key等
2,vdom存在的价值:数据驱动视图,控制dom操作
网友评论