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

React18源码: React中的LanePriority和SchedulerPriority

优先级区别和联系

  • 在源码中,3种优先级位于不同的js文件,是相互独立的
  • 注意:
    • LanePriority 和 SchedulerPriority 从命名上看,它们代表的是优先级
    • ReactPriorityLevel 从命名上看,它代表的是等级而不是优先级
      • 它用于衡量 LanePriority 和 Schedulerpriority

LanePriority

  • LanePriority: 属 react-reconciler 包,定义于 ReactFiberLane.js

    export const SyncLanePriority: LanePriority = 15;
    export const SyncBatchedLanePriority: LanePriority = 14;const InputDiscreteHydrationLanePriority: LanePriority = 13;
    export const InputDiscreteLanePriority: LanePriority = 12;// ...const OffscreenLanePriority: LanePriority = 1;
    export const NoLanePriority: LanePriority = 0;
    
  • 与fiber构造过程相关的优先级(如fiber.updateQueue,fiber.lanes)都使用LanePriority.

  • 由于本节重点介绍优先级体系以及它们的转换关系,关于Lane(车道模型)在fiber树构造时使用

SchedulerPriority

  • SchedulerPriority,属于scheduler包,定义于 SchedulerPriorities.js 中

    export const NoPriority = 0;
    export const ImmediatePriority = 1;
    export const UserBlockingPriority = 2;
    export const NormalPriority = 3;
    export const LowPriority = 4;
    export const IdlePriority = 5;
    
  • 与scheduler调度中心相关的优先级使用 SchedulerPriority

ReactPriorityLevel

  • reactPriorityLevel, 属于react-reconciler包,定义于 SchedulerWithReactIntegration.js中

    export const ImmediatePriority: ReactPrioritylevel = 99;
    export const UserBlockingPriority: ReactPriorityLevel = 98;
    export const NormalPriority: ReactPriorityLevel = 97;
    export const LowPriority: ReactPriorityLevel = 96;
    export const IdlePriority: ReactPriorityLevel = 95;
    // NoPriority is the absence of priority. Also React-only.
    export const NoPriority: ReactPriorityLevel = 90;
    
  • LanePriority 与 SchedulerPriority 通过 ReactPriorityLevel 进换

转换关系

  • 为了能协同调度中心(scheduler 包) 和 fiber树构造(react-reconciler包)中对优先级的使用

  • 则需要转换 SchedulerPriority 和 LanePriority, 转换的桥梁正是 ReactPriorityLevel

  • 在 SchedulerWithReactIntegration.js 中,可以互转 SchedulerPriority 和 ReactPriorityLevel

    // SchedulerPriority 转换成 ReactPrioritylevel
    export function getCurrentPriorityLevel(): ReactPriorityLevel {switch(Scheduler_getCurrentPriorityLevel()) {case Scheduler_ImmediatePriority:return ImmediatePriority;case Scheduler_UserBlockingPriority:return UserBlockingPriority;case Scheduler_NormalPriority:return NormalPriority;case Scheduler_LowPriority:return LowPriority;case Scheduler_IdlePriority:return IdlePriority;default:invariant(false, 'Unknown priority level.');}
    }// ReactPriorityLevel 转换成 SchedulerPriority
    function reactPriorityToSchedulerPriority(reactPrioritylevel) {switch(reactPriorityLevel) {case ImmediatePriority:return Scheduler_ImmediatePriority;case UserBlockingPriority:return Scheduler_UserBlockingPriority;case NormalPriority:return Scheduler_NormalPriority;case LowPriority:return Scheduler_LowPriority;case IdlePriority:return Scheduler_IdlePriority;default:invariant(false, 'Unknown priority level.');}
    }
    
  • ReactFiberLane.js中,可以互转 LanePriority 和 ReactPriorityLevel

    export function schedulerPriorityToLanePriority(schedulerPriorityLevel: ReactPriorityLevel,
    ): LanePriority {switch(schedulerPriorityLevel) {case ImmediateSchedulerPriority:return SyncLanePriority;// ...省略部分代码default:return NoLanePriority;}
    }export function lanePriorityToSchedulerPriority(lanePriority: LanePriority,
    ): ReactPriorityLevel {switch (lanePriority) {case SyncLanePriority:case SyncBatchedLanePriority:return ImmediateSchedulerPriority;//...省略部分代码default:invariant(false,'Invalid update priority: %s. This is a bug in React.',lanePriority,);}
    }
    

优先级使用

  • 通过 reconciler 运作流程中的归纳,reconciler 从输入到输出一共经历了4个阶段
  • 在每个阶段中都会涉及到与优先级相关的处理,正是通过优先级的灵活运用
  • React实现了可中断渲染,时间切片(timeslicing),异步渲染(suspense)等特性

相关文章:

React18源码: React中的LanePriority和SchedulerPriority

优先级区别和联系 在源码中,3种优先级位于不同的js文件,是相互独立的注意: LanePriority 和 SchedulerPriority 从命名上看,它们代表的是优先级ReactPriorityLevel 从命名上看,它代表的是等级而不是优先级 它用于衡量…...

Android Studio基础(下载安装与简单使用)

1、搭建Android开发平台 1.1 Android Studio 下载地址及版本说明 Android 开发者官网: https://developer.android.com/index.html(全球,需科学上网) https://developer.android.google.cn/index.html(国内&#xff…...

MyBatisPlus条件构造器和常用接口

前置配置文章 一、wapper介绍 wrapper的继承体系: Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : 查询条件封装UpdateWrapper &#x…...

ABAP 导入Excel表示例程序

目录 ABAP 导入excel示例程序创建程序使用的结构上传下载模板 ABAP 导入excel示例程序 批量导入程序,需要使用到导入模板,首先需要创建程序,之后是需要创建excel导入模板,并且需要将excel导入模板上传到SAP系统里面,之…...

Spring之AOP源码解析(中)

前言 在上一篇文章中,我们讲解了Spring中那些注解可能会产生AOP动态代理,我们通过源码发现,完成AOP相关操作都和ProxyFactory这个类有密切关系,这一篇我们将围绕这个类继续解析 演示 作用 ProxyFactory采用策略模式生成动态代理对象,具体生成cglib动态代理还是jdk动态代理,…...

《Docker极简教程》--Docker卷和数据持久化--Docker卷的使用

一、基本操作 1.1 创建Docker卷 创建 Docker 卷是在 Docker 中管理持久化数据的重要步骤之一。通过 Docker 卷,可以将数据与容器解耦,实现数据的持久化存储,并且可以在容器之间共享数据。以下是创建 Docker 卷使用 docker volume create 命…...

【Logback】如何在项目中快速引入Logback日志?

目录 1、引入相关依赖或者 jar 包 2、使用logback日志 3、引入logback配置文件 4、打印logback内部状态信息 Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快,占用空间更小,而且…...

【Linux从青铜到王者】 基础IO

本篇重点:文件描述符,重定向,缓冲区,磁盘结构,文件系统,inode理解文件的增删查改,查找一个文件为什么一定要有路径,动静态库,有的时候为什么找不到库,动态库的…...

C++之类作用域

目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…...

SpringCloud Gateway网关 全局过滤器[AntPathMatcher 某些路径url禁止访问] 实现用户鉴权

前提:先保证Gateway网关项目 和 Nacos注册中心 等可以正常访问和调用,搭建方法可查看博文SpringCloud Gateway网关 项目创建 及 整合Nacos开发_spring gateway如何设置工程名称-CSDN博客 类似的全局鉴权方案,参考如下: SpringClo…...

ELK介绍以及搭建

基础环境 hostnamectl set-hostname els01 hostnamectl set-hostname els02 hostnamectl set-hostname els03 hostnamectl set-hostname kbased -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config systemctl stop firewalld & systemctl disable firewalld# 安…...

Spring中的ApplicationContext.publishEvent

简单理解 其实就是监听处理。比如找工作平台上,雇主 employer 发布自己的雇佣条件,目的是平台中有符合条件的求职者时,及时向雇主推荐。求职者发布简历,当平台发现某个求职者比较符合条件,就触发被动,推荐…...

jackson、gson、fastjson和json-lib四种主流json解析框架对比

一、四种框架的介绍和对比 在Java中,Jackson、Gson、Fastjson和json-lib都是流行的JSON解析框架,它们各自有一些特点和优势。下面是对它们进行简要介绍和对比: 1.1 介绍 1) Jackson: Jackson是由FasterXML开发的一个高性能的J…...

已解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法

今天在使用 IDEA 使用 MyBatis 的时候遇到了这种情况: 可以看到 userMapper 下有个红色的波浪警告,虽然代码没有任何问题,能正常运行,但是这个红色警告在这里杵着确实让人很窝心。 于是我在网上找了找,最终明白了原因…...

在jar里限制指定的包名才可调用(白名单)。

1. 在jar包中定义一个接口,例如 用于检查传入的hash值是否匹配预设的值。 2. 在调用接口的地方,获取当前应用的hash值。 3. 将当前应用的hash值与预设的值进行比较,如果匹配,则允许调用接口;否则,拒绝调用。…...

python 提取PDF文字

使用pdfplumber,不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…...

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型。随着科技的不断发展,数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分,也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…...

C# (WebApi)整合 Swagger

SpringBoot-整合Swagger_jboot整合swagger-CSDN博客 C# webapi 也可以整合Swagger webapi运行其实有个自带的HELP页面 但是如果觉得UI不好看,且没办法显示方法注释等不方便的操作,我们也可以整合Swagger 一、使用NuGet控制台安装Swagger 在菜单中选择…...

导入excel某些数值是0

目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候,展示的字段和内表需要展示的字段不一致,导致显示的是0。 解决 修改展示的字…...

wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片

采用uniapp-vue3实现,透明辉光动画卡片,卡片内容包含标签、标题、副标题、图片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plu…...

Spark: a little summary

转眼写spark一年半了,从之前写机器学习组件、做olap到后面做图计算,一直都是用的spark,惭愧的是没太看过里面的源码。这篇文章的目的是总结一下Spark里面比较重要的point,重点部分会稍微看一下源代码,因为spark是跟cli…...

018—pandas 生成笛卡尔积排列组合合并多列字符串数据

思路: 本需求需要将给定的几列数据,生成一个排列组合形式的数据列,利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下(示例): import pandas as pd2.读入数据 代码如下&…...

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)

文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,本篇文章就写了一些基础算法…...

bugku3

前女友 md5 进去又是讴歌乱进的东西 源代码 看到code.txt,访问一下 <?php if(isset($_GET[v1]) && isset($_GET[v2]) && isset($_GET[v3])){$v1 $_GET[v1];$v2 $_GET[v2];$v3 $_GET[v3];if($v1 ! $v2 && md5($v1) md5($v2)){if(!strcmp($v3,…...

相机的白平衡

相机的白平衡是指相机根据拍摄环境的光源色温&#xff0c;调整图像中白色看起来应该是白色的功能。白平衡的设置对于确保图像中的颜色准确性非常重要&#xff0c;因为不同光源的色温会使白色看起来有不同的色调。 通常&#xff0c;相机提供了一些预设的白平衡模式&#xff0c;…...

刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现

刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接&#xff1a;https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组…...

Linux命令-chcon命令(修改对象(文件)的安全上下文)

说明 chcon命令 是修改对象&#xff08;文件&#xff09;的安全上下文&#xff0c;比如&#xff1a;用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用 --reference 选项时&#xff0c;把指定文件的安全环境设置为与参考文件相同。chcon命令位于 /…...

【漏洞复现】大华DSS视频管理系统信息泄露漏洞

Nx01 产品简介 大华DSS数字监控系统是一个在通用安防视频监控系统基础上设计开发的系统&#xff0c;除了具有普通安防视频监控系统的实时监视、云台操作、录像回放、报警处理、设备治理等功能外&#xff0c;更注重用户使用的便利性。 Nx02 漏洞描述 大华DSS视频管理系统存在信…...

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种&#xff0c;服务器可以主动向客户端推送信息&#xff0c;…...

docker install private registry 【docker 安装 registry 仅证书认证】

预备条件&#xff1a; 安装docker 我们设定镜像仓库域名为registry01.dev.com 配置/etc/hosts 192.168.23.51 registry01.dev.com安装 registry #!/bin/bashreg_ip$1 reg_n$2 reg_port$3if [ $# -eq 0 ]; thenecho "Usage: $0 [reg_ip] [registry_name]"echo &q…...