React lanes到底咋用啊

Python涨薪研究所

共 1812字,需浏览 4分钟

 · 2022-03-17


源 /         文/ 

先送大家一份福利:

《美团技术年货.pdf》(2019-2021)

在2022年春节到来之际,美团技术团队精选过去3年公众号50多篇技术文章以及 20多篇国际顶会论文,整理制作成一本厚达1200多页的电子书,作为新年礼物赠送给大家。 

这本电子书内容覆盖算法、前端、后端、数据、安全、测试等多个领域。

希望能对同学们的工作和学习有所帮助。

Code A Better Life


需要该PDF文档,可直接长按扫码添加好友,回复 「PDF」 获取:



很多朋友知道React内部有个lane的概念,但不知道怎么用。

React中存在不同功能的lane,本文通过讲解其中最重要的一种lane来达到让你理解lane如何使用的目的。

lane的含义

想必你对如下代码再熟悉不过了:

// 对于ClassComponent
onClick() {
  this.setState({a100})
}

// 对于FunctionComponent
const [updateNum, num] = useState(0);

其中this.setStateupdateNum的执行会触发更新。每个更新对应一个lane

所以当我们这么写代码:

onClick() {
  this.setState({a100})
  this.setState({b'hello'})
  this.setState({ctrue})
}

就会触发很多更新(这些更新会被合并在一起处理,这里按下不表)。

除了「在一个组件的回调中同时触发多个更新」,我们也经常会「在不同组件的回调中触发更新」

这两种情况都会产生一种结果:应用中同时存在一到多个lane

这就是lane的意义:他与更新对应。

lane与lanes

lane更新对应,更新状态对应,状态UI对应。

UI的变化通常是多个不同状态变化的结果,一路追溯回去,就与一到多个lane对应。

如何用一个变量表达「一到多个lane」呢?这就是lanes

lanelanes都是「31位二进制」,所以lanes可以很方便的表达「一到多个lane」,比如:

const laneA = 0b0001;
const laneB = 0b0010;

// lanes === 0b0011,lanes包含A和B
const lanes = laneA | laneB;

root.pendingLanes

lanes本身仅仅代表「lane的集合」,他的具体含义需要考虑「构成集合的lane的含义」

本文讲解的lanesroot.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


一键三连「分享」、「点赞」和「在看」



浏览 53
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报