React lanes到底咋用啊
共 1812字,需浏览 4分钟
·
2022-03-17 01:12
源 / 文/
先送大家一份福利:
《美团技术年货.pdf》(2019-2021)
在2022年春节到来之际,美团技术团队精选过去3年公众号50多篇技术文章以及 20多篇国际顶会论文,整理制作成一本厚达1200多页的电子书,作为新年礼物赠送给大家。
这本电子书内容覆盖算法、前端、后端、数据、安全、测试等多个领域。
希望能对同学们的工作和学习有所帮助。
Code A Better Life
很多朋友知道React
内部有个lane
的概念,但不知道怎么用。
React
中存在不同功能的lane
,本文通过讲解其中最重要的一种lane
来达到让你理解lane
如何使用的目的。
lane的含义
想必你对如下代码再熟悉不过了:
// 对于ClassComponent
onClick() {
this.setState({a: 100})
}
// 对于FunctionComponent
const [updateNum, num] = useState(0);
其中this.setState
或updateNum
的执行会触发更新。每个更新
对应一个lane
。
所以当我们这么写代码:
onClick() {
this.setState({a: 100})
this.setState({b: 'hello'})
this.setState({c: true})
}
就会触发很多更新(这些更新会被合并在一起处理,这里按下不表)。
除了「在一个组件的回调中同时触发多个更新」,我们也经常会「在不同组件的回调中触发更新」。
这两种情况都会产生一种结果:应用中同时存在一到多个lane
。
这就是lane
的意义:他与更新
对应。
lane与lanes
lane
与更新
对应,更新
与状态
对应,状态
与UI
对应。
UI
的变化通常是多个不同状态
变化的结果,一路追溯回去,就与一到多个lane
对应。
如何用一个变量表达「一到多个lane」呢?这就是lanes
。
lane
与lanes
都是「31位二进制」,所以lanes
可以很方便的表达「一到多个lane」,比如:
const laneA = 0b0001;
const laneB = 0b0010;
// lanes === 0b0011,lanes包含A和B
const lanes = laneA | laneB;
root.pendingLanes
lanes
本身仅仅代表「lane的集合」,他的具体含义需要考虑「构成集合的lane的含义」。
本文讲解的lanes
叫root.pendingLanes
。
对于一个庞大的应用,在同一时间,可能有很多组件会触发更新,就对应很多lane
。他们被统一保存在root.pendingLanes
中。
可以认为,root.pendingLanes
中记录了「应用中所有待执行的更新对应的lane」。
工作流程
当触发更新后,更新
对应的lane
会附加在root.pendingLanes
中,代表「待执行的lane又增加一个」。
接下来React
会从root.pendingLanes
中选择一批lane
组成lanes
,作为本次render
时需要考虑的lanes
(这批lanes
对于不同组件来说,对应不同更新
,最终对应UI
的变化)。
接下来开始每个组件的render
。
我们知道,组件render
时获取的状态
就是组件当前状态
,而状态
的值最终与lane
相关。所以,这一步是消费lane
获取状态
的过程。
最后,当页面完成渲染,root.pendingLanes
中会移除「本次render
时使用的lanes」(即上一步消费的lane
)。
如此反复,直到root.pendingLanes
为空。这就是root.pendingLanes
的工作流程。
总结
root.pendingLanes
只是众多lanes
之一,但他关系到React
整个更新流程。
其他lanes
都是在这个流程中的某些部分发挥作用。
end
顶级程序员:topcoding
做最好的程序员社区:Java后端开发、Python、大数据、AI
一键三连「分享」、「点赞」和「在看」