双缓存技术
双缓存技术
Q:能干啥?
- A:更快速的进行DOM更新。
Q:是啥?
-
**在内存中构建(Fiber树)并直接替换(真实dom树)**的技术。
双缓存中的Fiber树
current Fiber树
:当前屏幕上显示内容对应的Fiber树
workInProgress Fiber树
:正在内存中构建的Fiber树
- 通过
alternate
属性连接
构建/替换流程
示例
function App() {
const [num, add] = useState(0);
return (
<p onClick={() => add(num + 1)}>{num}</p>
)
}
ReactDOM.render(<App/>, document.getElementById('root'));
mount(挂载时)
-
首次执行
ReactDOM.render
会创建rootFiberNode
和rootFiber
。rootFiberNode
:整个应用的根节点,只有一个。rootFiber
:应用中可以多次调用ReactDOM.render
渲染不同的组件树,所以会拥有不同的rootFiber
-
接下来进入
render阶段
在内存中依次创建workInProgress fiber
并连接在一起构建workInProgress Fiber树
。(图中右侧为内存中构建的树,左侧为页面显示的树)
-
将已构建完的
workInProgress Fiber树
在commit阶段
渲染到页面。此时
DOM
更新为右侧树对应的样子。rootFiberNode
的current
指针指向workInProgress Fiber树
使其变为current Fiber 树
。
Update(更新时)
-
触发状态改变,这会开启一次新的
render阶段
并构建一棵workInProgress Fiber 树
。- 其中很多
workInProgress fiber
的创建可以复用current Fiber树
对应的节点数据。
- 其中很多
-
workInProgress Fiber 树
在render阶段
完成构建后进入commit阶段
渲染到页面上。- 渲染完毕后,
workInProgress Fiber 树
变为current Fiber 树
。
- 渲染完毕后,
区分fiber Root 与 rootFiber
fiber Root
-
表示Fiber数据结构对象,是Fiber数据结构中的外层对象
- 是整个应用的根节点,它包含了应用挂载的目标节点信息,并且记录了整个应用更新过程中的各种信息。
-
包含
rootFiber
,在current
属性中,存储footFiber
-
在React应用中
FiberRoot
只有一个。 -
会记录应用的更新信息
rootFiber
-
表示组件挂载点对应的Fiber对象
- 是
Fiber Root
的一部分,通常是应用中默认的组件挂载点
- 是
-
指向
fiberRoot
,在rootFiber
对象中的stateeNode
,指向fiberRoot
-
在React应用中可以有多个
rootFiber
,因为render方法可以被调用多次。