We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
上一节我们提到Scheduler与React是两套优先级机制。在React中,存在多种使用不同优先级的情况,比如:
Scheduler
React
优先级
注:以下例子皆为Concurrent Mode开启情况
Concurrent Mode
同步
Suspense
React需要设计一套满足如下需要的优先级机制:
更新
批
为了满足如上需求,React设计了lane模型。接下来我们来看lane模型如何满足以上 3 个条件。
lane
想象你身处赛车场。
不同的赛车疾驰在不同的赛道。内圈的赛道总长度更短,外圈更长。某几个临近的赛道的长度可以看作差不多长。
lane模型借鉴了同样的概念,使用 31 位的二进制表示 31 条赛道,位数越小的赛道优先级越高,某些相邻的赛道拥有相同优先级。
如下:
你可以在这里 (opens new window)看到lane的定义
其中,同步优先级占用的赛道为第一位:
从SyncLane往下一直到SelectiveHydrationLane,赛道的优先级逐步降低。
SyncLane
SelectiveHydrationLane
可以看到其中有几个变量占用了几条赛道,比如:
这就是批的概念,被称作lanes(区别于优先级的lane)。
lanes
其中InputDiscreteLanes是 “用户交互” 触发更新会拥有的优先级范围。
InputDiscreteLanes
DefaultLanes是 “请求数据返回后触发更新” 拥有的优先级范围。
DefaultLanes
TransitionLanes是Suspense、useTransition、useDeferredValue拥有的优先级范围。
TransitionLanes
useTransition
useDeferredValue
这其中有个细节,越低优先级的lanes占用的位越多。比如InputDiscreteLanes占了 2 个位,TransitionLanes占了 9 个位。
原因在于:越低优先级的更新越容易被打断,导致积压下来,所以需要更多的位。相反,最高优的同步更新的SyncLane不需要多余的lanes。
既然lane对应了二进制的位,那么优先级相关计算其实就是位运算。
比如:
计算a、b两个lane是否存在交集,只需要判断a与b按位与的结果是否为0:
a
b
0
计算b这个lanes是否是a对应的lanes的子集,只需要判断a与b按位与的结果是否为b:
将两个lane或lanes的位合并只需要执行按位或操作:
从set对应lanes中移除subset对应lane(或lanes),只需要对subset的lane(或lanes)执行按位非,结果再对set执行按位与。
set
subset
更多位运算参考MDN (opens new window)
这就是React的优先级模型lane模型。
至此,我们已经了解Fiber架构、更新的优先级、Scheduler的实现、lane模型。从下一节开始,我们会逐步讲解Concurrent Mode的各种应用。
Fiber
为该章节纠错 (opens new window)
上次更新: 11/8/2020, 10:35:41 AM https://react.iamkasong.com/concurrent/lane.html#%E8%A1%A8%E7%A4%BA%E4%BC%98%E5%85%88%E7%BA%A7%E7%9A%84%E4%B8%8D%E5%90%8C
The text was updated successfully, but these errors were encountered:
No branches or pull requests
上一节我们提到
Scheduler
与React
是两套优先级
机制。在React
中,存在多种使用不同优先级
的情况,比如:注:以下例子皆为
Concurrent Mode
开启情况同步
优先级Suspense
使用低优先级React
需要设计一套满足如下需要的优先级
机制:优先级
的不同优先级
的更新
,所以还得能表示批
的概念优先级
相关计算为了满足如上需求,
React
设计了lane
模型。接下来我们来看lane
模型如何满足以上 3 个条件。# 表示优先级的不同
想象你身处赛车场。
不同的赛车疾驰在不同的赛道。内圈的赛道总长度更短,外圈更长。某几个临近的赛道的长度可以看作差不多长。
lane
模型借鉴了同样的概念,使用 31 位的二进制表示 31 条赛道,位数越小的赛道优先级
越高,某些相邻的赛道拥有相同优先级
。如下:
其中,同步优先级占用的赛道为第一位:
从
SyncLane
往下一直到SelectiveHydrationLane
,赛道的优先级
逐步降低。# 表示 “批” 的概念
可以看到其中有几个变量占用了几条赛道,比如:
这就是
批
的概念,被称作lanes
(区别于优先级
的lane
)。其中
InputDiscreteLanes
是 “用户交互” 触发更新会拥有的优先级
范围。DefaultLanes
是 “请求数据返回后触发更新” 拥有的优先级
范围。TransitionLanes
是Suspense
、useTransition
、useDeferredValue
拥有的优先级
范围。这其中有个细节,越低
优先级
的lanes
占用的位越多。比如InputDiscreteLanes
占了 2 个位,TransitionLanes
占了 9 个位。原因在于:越低
优先级
的更新
越容易被打断,导致积压下来,所以需要更多的位。相反,最高优的同步更新的SyncLane
不需要多余的lanes
。# 方便进行优先级相关计算
既然
lane
对应了二进制的位,那么优先级
相关计算其实就是位运算。比如:
计算
a
、b
两个lane
是否存在交集,只需要判断a
与b
按位与的结果是否为0
:计算
b
这个lanes
是否是a
对应的lanes
的子集,只需要判断a
与b
按位与的结果是否为b
:将两个
lane
或lanes
的位合并只需要执行按位或操作:从
set
对应lanes
中移除subset
对应lane
(或lanes
),只需要对subset
的lane
(或lanes
)执行按位非,结果再对set
执行按位与。# 总结
这就是
React
的优先级模型lane
模型。至此,我们已经了解
Fiber
架构、更新
的优先级
、Scheduler
的实现、lane
模型。从下一节开始,我们会逐步讲解Concurrent Mode
的各种应用。为该章节纠错 (opens new window)
上次更新: 11/8/2020, 10:35:41 AM
https://react.iamkasong.com/concurrent/lane.html#%E8%A1%A8%E7%A4%BA%E4%BC%98%E5%85%88%E7%BA%A7%E7%9A%84%E4%B8%8D%E5%90%8C
The text was updated successfully, but these errors were encountered: