小推理:React18 比老版 React 更优秀的一个地方
作者:卡颂
简历:《React技术揭秘》作者
来源:SegmentFault 思否社区
大家好,我卡颂。
React18已经进入RC(release candidate)阶段,距离正式版只有一步之遥了。
v18新增了很多特性,今天,我们不聊新特性,而是来讲讲v18相比老版更优秀的一个细节:
v18中,组件render的次数可能更少
状态从何而来?
在如下组件中:
function App() {
const [num, update] = useState(0);
// ...省略
}
App组件render后会执行useState,返回num的最新值。
也就是说,组件必须render,才能知道最新的状态。为什么会这样呢?
考虑如下触发更新的代码:
const [num, update] = useState(0);
const onClick = () => {
update(100);
update(num => num + 1);
update(num => num * 3);
}
onClick执行后触发更新,更新导致App组件render,进而useState执行。
在useState内部,会遵循如下流程计算num:
update(100)将num变为100 update(num => num + 1)将num变为100 + 1 = 101 update(num => num * 3)将num变为101 * 3 = 303
baseState -> u0 -> u1 -> u2 = newState
Concurrent带来的变化
// 其中u1因为优先级低,被跳过
baseState -> u0 -> u2 = newState
update(100)将num变为100 update(num => num * 3)将num变为100 * 3 = 300
初始状态为100,update(num => num + 1)将num变为100 + 1 = 101
update(num => num * 3)将num变为101 * 3 = 303
新旧Concurrent的区别
// 更新优先级是否小于render的优先级
if (updateExpirationTime < renderExpirationTime) {
// ...被跳过
} else {
// ...不跳过
}
const renderLanes = 0b0101;
u1.lane = 0b0001;
u2.lane = 0b0010;
function isSubsetOfLanes(set, subset) {
return (set & subset) === subset;
}
// true
isSubsetOfLanes(renderLanes, u1.lane)
// false
isSubsetOfLanes(renderLanes, u2.lane)
u2.lane = 0b0000;
// true
isSubsetOfLanes(renderLanes, 0)
最后


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- C盘空间不足:2招让你“白得”50GB
- 案例征集 | 2024中国智慧矿山自动驾驶产业市场研究报告
- listmonk一款开源的邮件列表和营销平台
- 乔布斯编号电脑预计成交价 265 万元 ;开源软件托管商 Fosshost CEO 失联|思否周刊
- 美国发布《国家生物防御战略与实施计划》
- 我要让所有人知道,这片鱼塘被人工智能承包了!
- 保“链”稳产助企业,全力以赴稳住工业增长——访工业和信息化部副部长辛国斌
- 初春聚山城,统信UOS赋能智慧民航
- 微软镇江数字经济创新中心启动运营
- 知乎上市首日破发 收盘下跌10.53%;蔚来称因半导体短缺临时停产5个工作日;快手电商宣布开启直播电商2.0时代
- 中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要(下)
- 2020全球教育科技创新TOP50 | 亿欧智库



微信扫码关注公众号