作用:在DOM需要更新的时候,通过diff算法可以 计算出 虚拟DOM 中真正变化的部分,只针对变化的部分进行更新渲染,而不是重新渲染整个页面,造成不必要的性能浪费
原理:react中的diff原理其实是对传统diff的优化,传统的diff算法,需要遍历整棵树的节点然后进行比较,是一个深度递归的过程,性能很差
优化后的diif原理提出了三大策略:
1、tree diff —— 层级对比:只对相同层级的DOM节点进行比较,发现节点不存在就会直接删除这个节点和他下面的所有子节点,这样有序的对Dom树进行遍历,就能完成整个树的对比
2、component diff —— 组件对比
1)同类型组件对比遵循tree diff的规范
2)不同类型的组件对比,把不同的组件判断为不干净的组件(脏组件),然后替换这个组件和他下面的所有子节点
3)如果是同一类型的两个组件中,如果我们使开发人员而且知道Dom树没有发生任何变化,可以使用shouldComponentUpdate这个生命周期来判断组件是否需要进行diff
3、element diff —— 节点对比
面对全新节点时,执行插入的操作(字面意思,不用想的太复杂)
面对多余节点时,执行删除操作(有以下两种情况)
1)组件新集合中有组件旧集合中的类型,但对应的element不可更新,只能执行删除
2)旧组件不在新集合里面,执行删除
面对换位节点时,执行移动操作
eg:旧组件:[ A,B,C,D ] 新组件:[A,D,B,C]
以往在旧的diff算法中,只要面对不同的B/D就执行删除,再从新插入,这样浪费了很多复用的节点
在element diff算法中,对于新旧的层级都添加了唯一的 key 值进行区分,只要对应的key值和对应的元素没有改变,只需要移动就可以了
react的diff算法有什么用?原理是什么?
最新推荐文章于 2024-08-28 18:03:27 发布