前言
今天的文章来自
熊建刚的授权分享。正文从这开始~
React提供一种声明式API,使得我们不需要了解在每次更新时具体改变了什么。这使得开发应用很简单,但是React如何实现这一点并不明显。本篇文章介绍React的diff算法为何在满足高性能应用要求时,React组件的更新是可预测的。
在使用React时,我们首先思考创建React节点树的render()方法,在下一次state或props更新时,render()方法将返回另一个React元素树,随后React比较两颗不同的React节点树,并据此更新页面视图。
已经有一些基本方案解决在最小化操作下比较一颗React节点树到新的React节点树之间的不同。但是,最先进的算法时间复杂度也是O(n^3),n是节点树的元素数量。
diff算法
如果在React中使用这些算法,展示个元素将要进行10亿次比较,这个性能太低;React实现了一个时间复杂度为O(n)的探索式算法,该算法基于两点假设:
不同类型的元素生成不同的节点树
开发者通过key属性的不同表现指出哪个子元素应该渲染。
实际上,这两点假设对于大多数实践是有效的。
在比较两个React节点树时,React首先比较根元素,随后的行为取决于根元素类型。
根节点不同类型
只要根节点类型不同,React就会销毁旧节点树,创建新节点树。
在销毁节点树时,旧的DOM节点会被销毁,React组件实例触发