我的编程空间,编程开发者的网络收藏夹
学习永远不晚

setState的用法有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

setState的用法有哪些

setState的用法有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

setState是同步还是异步?

首先,这个问题的抛出,我会想为什么要抛出这个问题呢?如果说,你需要依赖状态更新后的值时,那么首先如何做呢?

  • 对于Class Component而言,我们可以在componentDidMount或者是componentDidUpdate阶段来执行。

  • 对于Function Component而言,我们可以在useEffect的回调函数中执行。

首先,我们先给出结论,在React中不同的模式它的情况是不一样的,主要拿两种模式来说。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. legacy模式

  3. concurrent模式

legacy 模式

这是当前 React app 使用的方式??

ReactDOM.render(<App />, rootNode)

当前没有计划删除本模式,但是这个模式可能不支持这些新功能。

回到我们上述的问题,setState是同步的还是异步的?

  • 当在legacy模式下,命中batchedUpdates时,setState是异步的。

  • 当在legacy模式下,没命中batchedUpdates时,setState是同步的。

既然聊到了这里,我们来说一说batchedUpdates函数的作用。

那么它是干嘛的呢?如果你在处理逻辑函数中多次调用this.setState时,它是如何更新状态的呢?

this.setState({   value: this.state.value + 1 }) this.setState({   value: this.state.value + 1 }) this.setState({   value: this.state.value + 1 })

那React实现了这个批量更新的操作,将多次的setState合并为一次更新,那么它是如何实现的呢?batchedUpdates函数就登场了。

function batchedUpdates$1(fn, a) {     var prevExecutionContext = executionContext;     executionContext |= BatchedContext;      try {       return fn(a);     } finally {       executionContext = prevExecutionContext;        if (executionContext === NoContext) {         // Flush the immediate callbacks that were scheduled during this batch         resetRenderTimer();         flushSyncCallbackQueue(); // 同步的更新       }     }   }

这个函数会传递一个fn,当执行fn之前,会在executionContext变量上附加一个BatchedContext,当fn执行完毕后,executionContext就会把之前的BatchedContext标记给去除掉。

  • 这样子一来,当executionContext带上了BatchedContext标记的话,react内部就会去做判断,带上了这个标记,这次的更新就是批处理,那么此次更新就是异步的。

那么,我们是不是能够假设一下,如果在执行完fn函数后,再去更新状态的话,是不是就能完成同步的更新呢?

setTimeout函数,我们可以把setState放在定时器中,这样子一来的话,当fn函数执行完时,BatchedContext标记也去掉了,然后等到  setTimeout 的回调函数等到空闲被执行的时候,才会执行 setState。

setTimeout(() => {     this.setState({ value: this.state.value + 1})   }, 0)

这也就是当executionContext ===  NoContext,也就是会执行flushSyncCallbackQueue函数,完成此次的同步更新。

当然了,在concurrent 模式下,又是有所不同的。

这个时候,我们得谈一谈scheduleUpdateOnFiber函数。

我们都知道任务调度的起点是 scheduleUpdateOnFiber  方法,React.render、setState、forceUpdate、React Hooks 的dispatchAction 都会经过  scheduleUpdateOnFiber。

function scheduleUpdateOnFiber(fiber, lane, eventTime) {     // ...     if (root === workInProgressRoot) {       // ......      } // TO an argument to that function and this one.     if (lane === SyncLane) {  // 同步任务       if ( // 检查当前是不是在unbatchedUpdates(非批量更新),(初次渲染的ReactDOM.render就是unbatchedUpdates)       (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering       (executionContext & (RenderContext | CommitContext)) === NoContext) {         // Register pending interactions on the root to avoid losing traced interaction data.         schedulePendingInteractions(root, lane);          performSyncWorkOnRoot(root);       } else {         ensureRootIsScheduled(root, eventTime);         schedulePendingInteractions(root, lane);         if (executionContext === NoContext) {           resetRenderTimer();           flushSyncCallbackQueue();         }       }     } else { // 异步任务       // concurrent模式下是跳过了 flushSyncCallbackQueue 同步更新       // ....     }    }

scheduleUpdateOnFiber函数通过lane ===  SyncLane来判断是同步任务还是异步任务,我们通过ReactDom.render()方式创建的React  app是会进入这个判断的,而concurrent模式下,则不同,那么它是如何创建的呢??

concurrent 模式

你可以理解成,这个暂时还是实验阶段,当未来稳定后,将会作为React开发的默认开发模式,它是如何创建一个React App应用的呢??

ReactDOM.createRoot(rootNode).render(<App />)

这个模式开启了所有的新功能。

concurrent模式下状态的更新都是异步的。

关于React的concurrent 模式解读,有兴趣可以看看官方文档。

到这里的话,似乎我们对React中setState是同步的还是异步的就有所了解了。

  • 哪些会命中batchUpdate机制

  • 生命周期(和它调用函数)

  • React中注册的事件

  • React可以'管理入口'

关于setState的用法有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

setState的用法有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

eaglephp的用法有哪些

EaglePHP 是一个轻量级的 PHP 框架,用于快速开发 Web 应用程序。它提供了许多功能和工具,简化了常见的开发任务。以下是 EaglePHP 的一些常见用法:1. 路由:EaglePHP 提供了简单易用的路由功能,可以根据 URL
2023-08-16

objection的用法有哪些

1. 提出异议:She objected to the proposed plan.(她对提议的计划提出异议。)2. 反对:He objected strongly to the new policy.(他强烈反对这项新政策。)3. 反对某
2023-08-24

originlab的用法有哪些

OriginLab是一款科学绘图和数据分析软件,主要用于研究人员和工程师进行数据可视化和数据分析。以下是OriginLab的一些常见用法:1. 数据可视化:OriginLab提供多种绘图选项,如线图、散点图、柱状图、等高线图等,可以将数据以
2023-08-26

createevent的用法有哪些

在使用`createevent`方法时,可以传入不同的参数来定制事件的特征。以下是`createevent`方法的主要用法:1. 创建一个自定义事件:可以使用`createevent`方法来创建一个自定义的事件对象,可以通过`Event`构
2023-08-08

rapidxml的用法有哪些

RapidXML是一个用于解析和操作XML文档的C++库。它具有简单易用、高效和轻量级的特点。以下是RapidXML库的一些常见用法:1. 解析XML文档:使用RapidXML库可以将XML文档解析为DOM树结构,便于后续的操作和查询。``
2023-09-04

register的用法有哪些

"register"这个词的用法有多种,以下是一些常见的用法:1. 注册(verb):指向某个机构或系统注册,以成为其成员或用户。例句:You need to register on our website to access the co
2023-09-14

iptables的用法有哪些

本篇文章为大家展示了iptables的用法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。总览 用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改 iptables &
2023-06-13

jstorm的用法有哪些

JStorm是一个开源的实时流式计算系统,主要用于处理大规模数据流。它类似于Apache Storm,但具有更高的性能和可伸缩性。以下是JStorm的主要用法:1. 流式计算:JStorm能够处理实时数据流并进行复杂的计算。它支持丰富的计算
2023-08-24

dezender的用法有哪些

Dezender是一种用于解码加密的PHP文件的工具。它可以用于还原被obfuscated(混淆)或加密的PHP代码,使其可读性更高。以下是Dezender的用法:1. 解码obfuscated的PHP文件:使用Dezender可以还原被混
2023-08-24

winlicense的用法有哪些

WinLicense是一款专业的软件保护工具,用于保护和加密Windows应用程序。其主要功能和用法包括:1. 加密和保护应用程序代码:WinLicense可以对应用程序的代码进行加密和混淆,以防止反汇编和逆向工程。2. 许可证管理:Win
2023-08-25

nbtscan的用法有哪些

nbtscan是一款用于扫描和识别局域网中运行NetBIOS服务的工具。以下是nbtscan的一些常见用法:1. 扫描单个主机:nbtscan 。该命令将扫描指定的主机,并列出其NetBIOS名称、IP地址和MAC地址等信息。2. 扫描整个
2023-08-26

DecimalFormat的用法有哪些

DecimalFormat是Java中用来格式化数字的类,它可以根据指定的模式将数字格式化为特定的格式。以下是使用DecimalFormat的一些常见用法:创建DecimalFormat对象:DecimalFormat df = new D
DecimalFormat的用法有哪些
2024-03-08

JSON.stringify的用法有哪些

JSON.stringify()方法用于将JavaScript对象转换为一个JSON字符串。它有以下用法:1. 将对象转换为JSON字符串```javascriptlet obj = { name: "John", age: 30 };le
2023-08-12

iframe的用法有哪些

iframe用于在当前网页中嵌入另一个网页或者嵌入其他内容,常用的用法有:1. 嵌入其他网页:可以通过设置iframe的src属性来指定要嵌入的网页链接,例如:```html```2. 嵌入本地文件:可以通过设置iframe的src属性为本
2023-08-18

mshtml的用法有哪些

mshtml是一个用于操作HTML文档的COM组件,主要用于开发Windows桌面应用程序。以下是一些mshtml的常见用法:1. 加载HTML文档:使用`IWebBrowser2`接口的`Navigate`方法来加载HTML文档,可以是本
2023-09-16

ipvsadm的用法有哪些

ipvsadm是一个用于管理IPVS(IP Virtual Server)的工具,它可以通过命令行来配置和管理IPVS的规则和状态。下面是ipvsadm的一些常用的用法:显示IPVS的规则和状态信息:`ipvsadm -L`添加IPVS的虚
2023-10-24

有趣的Python用法有哪些

这篇文章主要讲解了“有趣的Python用法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有趣的Python用法有哪些”吧!有趣的用法1.for-else用法循环正常结束则执行else语
2023-06-02

编程热搜

目录