React Diff原理深入分析

在了解Diff前,先看下React的虚拟DOM的结构

这是html结构

I am child p

I am child div

这是React渲染html时的js代码   自己可以在babel上试试

React.createElement("div", {id: "father"}, 
    React.createElement("p", {class: "child"}, "I am child p"),             
    React.createElement("div", {class: "child"}, "I am child div")
);

由此可以看出这是一个树结构

React Diff原理深入分析_第1张图片

React在调用render方法时会创建一颗树(简称pre),在下一次调用render方法时会返回一颗不同的树(简称cur)。React就会比较pre和cur这两棵树之间的差别来判断如何高效的更新UI,保证当前UI与最新的树cur保持同步。

为了高效更新UI,React在以下两个假设的基础上提出了一套O(n)的启发算法:

1.两个不同类型的元素会产生出不同的树;

2.开发者可以通过设置 key 属性,来告知渲染哪些子元素在不同的渲染下可以保存不变;

Diffing 算法

逐层比较

在对比两棵树时,React是逐层进行比较的,只会对相同颜色框内的DOM节点进行比较。

React Diff原理深入分析_第2张图片

首先比较两棵树的根节点,不同类型的根节点会有不同的形态。当根节点为不同类型的元素时,React 会拆卸原有的树并且建立起新的树。举个例子,当一个元素从  变成 ,从 

 变成 ,或从 

你可能感兴趣的:(React Diff原理深入分析)