首页 > 其他分享 >useState的执行流程

useState的执行流程

时间:2024-08-15 22:15:51浏览次数:14  
标签:流程 update dispatch hook useState 执行 方法

useState

useState 的工作流程可以分为两步:

  • 声明阶段:在组件渲染时执行 useState 方法
  • 调用阶段:触发点击事件时,执行 dispatch(通过 useState 返回的数组的第二个参数)

调用阶段

首先通过点击事件会执行 dispatch 方法。在 React 源码当中 dispatch 对应的是 dispatchAction 方法。

在 dispatchAction 方法内部会创建 update 对象,其中 update 对象具有 action 和 next 等属性。action 属性一般指执行 dispatch 方法时传入的一个参数,可能是一个值也可能是一个函数。next 属性用来指向其他 update 构成单向环状链表数据结构。最后将 update 插入到 hook.queue.pending 这条单向环状链表中。最后执行 scheduleUpdateOnFiber 方法调度状态更新。

通过 scheduleUpdateOnFiber 方法会依次执行 ensureRootIsScheduled、perfornCouncurrentWorkOnRoot、renderRootConcurrent、performUnitOfWork、beginWork 方法。

在 beginWork 方法中会根据 workInProgress.tag 判断,如果是 FunctionComponent 会调用 updateFunctionComponent 方法。然后执行 renderWithHooks 方法来执行函数组件。

在执行函数组件时就会执行 useState。

声明阶段

通过 dispatch 方法触发的状态更新流程中执行的 useState 对应的是 updateReducer 方法。

在 updateReducer 方法中会获取当前 useState 对应的 hook。hook 是在 mount 阶段通过 mountWorkInProgressHook 方法创建的。它包含memoizedState、queue、next 等属性。

memoizedState 用来保存 useState 传入的 initialState 和计算后的 state。queue 用来保存 dispatch 创建的 update 单向链表。next 用来执行下一个 hook。

拿到 hook 后会执行计算 update 的逻辑。关键就是判断 action 是否是一个函数,如果是函数则将上次的state作为参数传递进去然后执行该函数。否则直接返回 action 。将最后的结果再保存到hook.memoizedState 属性上并返回。

后续的执行流程就是根据 FunctionComponent 的执行结果创建 workInProgress fiber 节点。然后接着执行 complelteWork 方法比较变化的属性然后保存到 fiber.updateQueue 属性上。

在 commit 阶段的 muatation 阶段执行变化属性的赋值到对应的 dom 节点上。

然后切换 fiberRootNode.current 指针由 current fiber 树切换为 workInProgress fiber 树。

结束更新。

标签:流程,update,dispatch,hook,useState,执行,方法
From: https://www.cnblogs.com/rocenjs/p/18361903

相关文章

  • Spring Boot应用的版本控制与发布流程
    SpringBoot应用的版本控制与发布流程大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在软件开发过程中,版本控制和发布流程是确保软件质量和高效协作的关键环节。SpringBoot作为当前流行的Java开发框架,与版本控制和持续集成/持续部署(CI/CD)工具的集成......
  • PCB入门笔记—绘制一个只有两个排针的PCB全流程记录—立创EDA专业版
    PCB绘制入门......
  • Linux_开机_关机_重启_的时候执行脚本
    Linux_开机_关机_重启_的时候执行脚本转载注明来源:本文链接来自osnosn的博客,写于2024-08.参考Linux关机时执行指定脚本如何在Systemd下配置并运行关机前的脚本在Linux启动或重启时执行命令与脚本Centos7关机和重启前执行自定义脚本如何在重启或启动时执行命令或脚......
  • md5sum+可执行文件 怎么理解?
    `md5sum`是一个在Unix、Linux以及其他类Unix系统中广泛使用的命令行工具,用于计算和校验文件的MD5哈希值。MD5哈希是一种广泛使用的加密哈希函数,可以产生一个128位(16字节)的哈希值(通常以32位的十六进制数表示),用于验证文件的完整性和一致性。 当你看到`md5sum`与“可......
  • 0233-Net-linux 收包流程
    环境Time2022-11-27WSL-Ubuntu22.04前言说明参考:https://github.com/leandromoreira/linux-network-performance-parameters目标了解linux系统接收网络数据包的具体流程。数据到达网卡网卡将光电信号还原成数据包。网卡校验如果不是在混杂模式下,网卡校验数据包中......
  • 用html2canvas转当前网页为图片的流程
    1、从canvas中直接提取图片元数据//图片导出为png格式vartype='png';varimgData=canvas.toDataURL(type);上面的代码得到的数据格式为:data:image/png;base64,.....2、将mime-type改为image/octet-stream,强制让浏览器直接download**获取mimeType@param{Str......
  • SpringMVC流程
    SpringMVC流程 主要组件:DispatcherServlet:SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它处理和分发。HandlerMapping:SpringMVC提供,我们需要进行IoC配置,使其加入到IoC容器。它内部缓存handler(controller方法),和handler访问路径数......
  • 忍龙2 不升级流程
    最近电脑上用模拟器复习了一下忍龙2原版.之前打过忍龙2的不升级武器,不升级血的流程.想过禁忍术,但是有几个地方禁了太难打,就没禁.难点:很多小怪都可以来回跑图,让地图自己检测小怪距离忍龙太远,自动删除小怪.第一关关底,飞燕杀死小怪之后,跑到bos边上,落地吸魂超杀之后3......
  • 简化文本处理流程,通用文字识别助力提升信息采集效率
    随着信息技术的发展、移动设备使用的普及和全球化的商业需求,非结构化数据转换为结构化数据的需求日益增长,数字化成为信息存储和管理的主流趋势。在此背景下,OCR技术应运而生,该技术可以将图像中文本信息转化为计算机等设备可以使用的字符信息,成为现代信息处理的关键技术。OCR技术丰......
  • 轻松理解es6执行上下文
    想要学好js,深入理解js的如何运行肯定是少不了的。这篇文章是结合各个网站上的大佬们的文章在加上自己的理解形成的,如有错误的地方,请帮我纠正一下,谢谢。前言当js引擎去执行一段代码的时候,如何确定代码的执行顺序,以及变量何时被定义,this的指向等,想要更深入理解这些问题,必须了......