• React源码分析8-状态更新的优先级机制


    为什么需要优先级

    优先级机制最终目的是为了实现高优先级任务优先执行,低优先级任务延后执行

    实现这一目的的本质就是在低优先级任务执行时,有更高优先级任务进来的话,可以打断低优先级任务的执行。

    同步模式下的react运行时

    我们知道在同步模式下,从 setState虚拟DOM遍历,再到真实DOM更新,整个过程都是同步执行且无法被中断的,这样可能就会出现一个问题 —— 用户事件触发的更新被阻塞。

    什么是用户事件触发的更新被阻塞?如果 React 正在进行更新任务,此时用户触发了交互事件,且在事件回调中执行了 setState,在同步模式下,这个更新任务需要 等待 当前正在更新的任务完成之后,才会被执行。假如当前 React 正在进行的更新任务耗时比较久,用户事件触发的更新任务不能及时被执行,造成下个更新任务被阻塞,从而形成了卡顿。

    这时候,我们就希望能够及时响应用户触发的事件,优先执行用户事件触发的更新任务,也就是我们说的异步模式

    我们可以比较一下,同步模式下和异步模式(优先级机制)下更新任务执行的差异

    import React from "react";
    import "./styles.css";
    
    export default class extends React.Component {
       
      constructor() {
       
        super();
        this.state = {
       
          list: new Array(10000).fill(1),
        };
        this.domRef = null;
      }
      componentDidMount() {
       
        setTimeout(() => {
       
          console.log("setTimeout 准备更新", performance.now());
          this.setState(
            {
       
              list: new Array(10000).fill(Math.random() * 10000),
              updateLanes: 16
            },
            () => {
       
              console.log("setTimeout 更新完毕", performance.now());
            }
          );
        }, 100);
        setTimeout(() => {
       
          this.domRef.click();
        }, 150);
      }
    
      render() {
       
        const {
        list } = this.state;
        return (
          <div
            ref={
       (v) => (this.domRef = v)}        className="App"        onClick={
       () => {
                 console.log("click 准备更新", performance.now());          this.setState(            {
        list: new Array(10000).fill(2), updat
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    RStudio学习笔记(一)
    数据库信息速递 MONGODB 6.0 的新特性,更多的查询函数,加密查询,与时序数据集合 (译)...
    ES6, ES7, ES8, ES9 以及 ES10 新特征
    MySQL-Q&A-异常问题及解决方案(持续更新)
    微信小程序之个人中心授权登录
    npm 最新淘宝镜像配置 + nrm工具配置及使用
    实验室预约管理系统(Java+SSH+Web+MySQL+ofbiz系统)
    垃圾回收机制
    2023年中国数据存储市场现状及发展前景预测分析
    Dubbo之服务分组、分组聚合。
  • 原文地址:https://blog.csdn.net/It_kc/article/details/127743928