当前位置: 首页 > news >正文

前端宝典之六:React源码解析之lane模型

本文主要内容:
介绍lane模型

一、 lane模型

lane模型就是react优先级的机制,可以用来

  • 可以表示优先级的不同
  • 可能同时存在几个同优先级的更新,所以还得能表示批的概念
  • 方便进行优先级相关计算

1、表示优先级不同

lane模型使用31位的二进制表示31条赛道,位数越小的优先级越高,某些相邻的位拥有相同优先级。

export const NoLanes: Lanes = /*                        / 0b0000000000000000000000000000000;
export const NoLane: Lane = /                          / 0b0000000000000000000000000000000;export const SyncLane: Lane = /                        / 0b0000000000000000000000000000001;
export const SyncBatchedLane: Lane = /                 / 0b0000000000000000000000000000010;export const InputDiscreteHydrationLane: Lane = /      / 0b0000000000000000000000000000100;
const InputDiscreteLanes: Lanes = /                    / 0b0000000000000000000000000011000;const InputContinuousHydrationLane: Lane = /           / 0b0000000000000000000000000100000;
const InputContinuousLanes: Lanes = /                  / 0b0000000000000000000000011000000;export const DefaultHydrationLane: Lane = /            / 0b0000000000000000000000100000000;
export const DefaultLanes: Lanes = /                   / 0b0000000000000000000111000000000;const TransitionHydrationLane: Lane = /                / 0b0000000000000000001000000000000;
const TransitionLanes: Lanes = /                       / 0b0000000001111111110000000000000;const RetryLanes: Lanes = /                            / 0b0000011110000000000000000000000;export const SomeRetryLane: Lanes = /                  / 0b0000010000000000000000000000000;export const SelectiveHydrationLane: Lane = /          / 0b0000100000000000000000000000000;const NonIdleLanes = /                                 / 0b0000111111111111111111111111111;export const IdleHydrationLane: Lane = /               / 0b0001000000000000000000000000000;
const IdleLanes: Lanes = /                             / 0b0110000000000000000000000000000;export const OffscreenLane: Lane = /                   */ 0b1000000000000000000000000000000;
同步优先级占用的位数为第一位
export const SyncLane: Lane = /*                        */ 0b0000000000000000000000000000001;

2、 表示“批”的概念

const InputDiscreteLanes: Lanes = /*                    / 0b0000000000000000000000000011000;
export const DefaultLanes: Lanes = /                   / 0b0000000000000000000111000000000;
const TransitionLanes: Lanes = /                       */ 0b0000000001111111110000000000000;

其中的某些变量占了多个位,这就是批
其中InputDiscreteLanes是“用户交互”触发更新会拥有的优先级范围。
DefaultLanes是“请求数据返回后触发更新”拥有的优先级范围。
TransitionLanes是Suspense、useTransition、useDeferredValue拥有的优先级范围。
这其中有个细节,越低优先级的lanes占用的位越多。比如InputDiscreteLanes占了2个位,TransitionLanes占了9个位。
原因在于:越低优先级的更新越容易被打断,导致积压下来,所以需要更多的位。相反,最高优的同步更新的SyncLane不需要多余的lanes

3、 方便进行优先级相关计算

使用位运算符

// 判断a b是否有交集
export function includesSomeLane(a: Lanes | Lane, b: Lanes | Lane) {return (a & b) !== NoLanes;
}// 计算b这个lanes是否是a对应的lanes的子集,只需要判断a与b按位与的结果是否为b:
export function isSubsetOfLanes(set: Lanes, subset: Lanes | Lane) {return (set & subset) === subset;
}// 将两个lane或lanes的位合并只需要执行按位或操作:
export function mergeLanes(a: Lanes | Lane, b: Lanes | Lane): Lanes {return a | b;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android MVVM框架详解与应用
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • CentOS 7 安装流程详细教程
  • 【嵌入式烧录刷写文件】-1.10-为一个Motorola S-record(S19/SREC/mot/SX)文件计算“校验和Checksum”
  • 【Java学习】实现图书管理系统
  • 探索DevExpress WinForms:.NET世界中的UI库之星
  • 【JAVA入门】Day22 - 包装类
  • 无字母数字绕过正则表达式
  • 企业内耗的解决策略:打造活力四溢的文化社区
  • Python 加载 TensorFlow 模型
  • 如何复现Github上的项目以及conda的常用操作指令
  • python opencv实时视频输入
  • 数据可视化之旅,从数据洞察到图表呈现,可视化的产品设计
  • 【面试最常考算法】哈希表专题
  • 《AI办公类工具PPT系列之二——iSlide AI》
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • js继承的实现方法
  • JS实现简单的MVC模式开发小游戏
  • Nacos系列:Nacos的Java SDK使用
  • Selenium实战教程系列(二)---元素定位
  • swift基础之_对象 实例方法 对象方法。
  • Vue2.x学习三:事件处理生命周期钩子
  • 程序员该如何有效的找工作?
  • 初识MongoDB分片
  • 工程优化暨babel升级小记
  • 简单基于spring的redis配置(单机和集群模式)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一些css基础学习笔记
  • 做一名精致的JavaScripter 01:JavaScript简介
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ${ }的特别功能
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (C语言)逆序输出字符串
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一) springboot详细介绍
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net MySql
  • .NET下的多线程编程—1-线程机制概述
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .sys文件乱码_python vscode输出乱码
  • 。Net下Windows服务程序开发疑惑
  • /etc/motd and /etc/issue
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [001-03-007].第07节:Redis中的事务
  • [18] Opencv_CUDA应用之 基于颜色的对象检测与跟踪
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——