react
的类组件每产生一个更新, 就会创建相应的update
, 并追加到该组件对应的fiber
上的updateQueue
单向链表上, 那么updateQueue
的结构是怎样的, 来记录下.
更新
[2019-7-17]
前言
react每产生一次更新, 都会:
- 计算
expirationTime
- 创建
update
- 初始化
update
参数
- 将
update
追加到updateQueue
那么, 问题来了, 这个updateQueue
是一种什么结构?
带着问题, 来到源码看一下
分析
enqueueUpdate
react在执行将update追加到updateQueue
操作的时候, 会判断当前fiber
节点上是否已经具有updateQueue
, 如果没有, 会调用createUpdateQueue
创建一个新的队列.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export function enqueueUpdate<State>(fiber: Fiber, update: Update<State>) { const alternate = fiber.alternate; let queue1; let queue2;
if (alternate === null) { queue1 = fiber.updateQueue; queue2 = null; if (queue1 === null) { queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState); } } }
|
createUpdateQueue
上面已经说过了, createUpdateQueue
会创建一个新的单向链表
状的更新队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| export function createUpdateQueue<State>( // 初始的state baseState: State ): UpdateQueue<State> { const queue: UpdateQueue<State> = { baseState, firstUpdate: null, lastUpdate: null, firstCapturedUpdate: null, lastCapturedUpdate: null, firstEffect: null, lastEffect: null, firstCapturedEffect: null, lastCapturedEffect: null, };
return queue; }
|
updateQueue
最后来看一下updateQueue
的结构定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| export type UpdateQueue<State> = { baseState: State,
firstUpdate: Update<State> | null, lastUpdate: Update<State> | null,
firstCapturedUpdate: Update<State> | null, lastCapturedUpdate: Update<State> | null,
firstEffect: Update<State> | null, lastEffect: Update<State> | null,
firstCapturedEffect: Update<State> | null, lastCapturedEffect: Update<State> | null, };
|