简述diff算法过程
diff算法是比较两个vdom,计算出最小的变更,以便减少DOM操作次数,提高性能。
核心原理
- 只比较同一层级
- tag不相同删除重建,后续tag不在深度比较
- tag和key相同认为是同一节点,不在深度比较
算法过程
首先,它会判断是否是首次渲染,因为如果是首次渲染,没有旧的vnode,不需要比较,直接渲染
非首次渲染,首先比较两个节点的tag和key是否一样。如果不一样,直接删除重建;如果一样,则进一步比较两个vnode;
- 新vnode text有值(children无值):设置新text,且判断旧children如果有值,直接删掉
- 新vnode text无值,新children有值,旧children无值:添加children,且判断旧text如果有值,设置为空
- 新vnode text无值,旧children有值,新children无值:删除children
- 新vnode text无值,旧有值:设置text为空
- 新vnode text无值,旧 新children都有值:这时会使用双端比较来比较新旧children list,如果双端比较没通过,则会用新children里面每个vnode key去旧children找相同的key节点;没找到则算是新节点插入,找到了再进行比较两个vnode(递归)