返回顶部
首页 > 资讯 > 前端开发 > VUE >setState的用法有哪些
  • 210
分享到

setState的用法有哪些

2024-04-02 19:04:59 210人浏览 泡泡鱼
摘要

setState的用法有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。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的用法有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网VUE频道了解更多相关知识。

--结束END--

本文标题: setState的用法有哪些

本文链接: https://lsjlt.com/news/83398.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • setState的用法有哪些
    setState的用法有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。setState是同步还是异步首先,这个问题的抛出,我会想为什么...
    99+
    2024-04-02
  • redis的用法有哪些
    这篇文章主要介绍了redis的用法有哪些,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。1. 高并发缓存/共享session:UserInfo g...
    99+
    2024-04-02
  • html5的用法有哪些
    html5的用法有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。html5可以做:1、新的图形库,用HTML5做游戏也是不错的选择;2、更...
    99+
    2024-04-02
  • iptables的用法有哪些
    本篇文章为大家展示了iptables的用法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。总览 用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改 iptables &...
    99+
    2023-06-13
  • register的用法有哪些
    "register"这个词的用法有多种,以下是一些常见的用法:1. 注册(verb):指向某个机构或系统注册,以成为其成员或用户。例...
    99+
    2023-09-14
    register
  • mshtml的用法有哪些
    mshtml是一个用于操作HTML文档的COM组件,主要用于开发Windows桌面应用程序。以下是一些mshtml的常见用法:1. ...
    99+
    2023-09-16
    mshtml
  • rapidxml的用法有哪些
    RapidXML是一个用于解析和操作XML文档的C++库。它具有简单易用、高效和轻量级的特点。以下是RapidXML库的一些常见用法...
    99+
    2023-09-04
    rapidxml
  • ipvsadm的用法有哪些
    ipvsadm是一个用于管理IPVS(IP Virtual Server)的工具,它可以通过命令行来配置和管理IPVS的规则和状态。...
    99+
    2023-10-24
    ipvsadm
  • createevent的用法有哪些
    在使用`createevent`方法时,可以传入不同的参数来定制事件的特征。以下是`createevent`方法的主要用法:1. 创...
    99+
    2023-08-08
    createevent
  • JSON.stringify的用法有哪些
    JSON.stringify()方法用于将JavaScript对象转换为一个JSON字符串。它有以下用法:1. 将对象转换为JSON...
    99+
    2023-08-12
    JSON.stringify
  • eaglephp的用法有哪些
    EaglePHP 是一个轻量级的 PHP 框架,用于快速开发 Web 应用程序。它提供了许多功能和工具,简化了常见的开发任务。以下是...
    99+
    2023-08-16
    eaglephp
  • iframe的用法有哪些
    iframe用于在当前网页中嵌入另一个网页或者嵌入其他内容,常用的用法有:1. 嵌入其他网页:可以通过设置iframe的src属性来...
    99+
    2023-08-18
    iframe
  • objection的用法有哪些
    1. 提出异议:She objected to the proposed plan.(她对提议的计划提出异议。)2. 反对:He o...
    99+
    2023-08-24
    objection
  • jstorm的用法有哪些
    JStorm是一个开源的实时流式计算系统,主要用于处理大规模数据流。它类似于Apache Storm,但具有更高的性能和可伸缩性。以...
    99+
    2023-08-24
    jstorm
  • dezender的用法有哪些
    Dezender是一种用于解码加密的PHP文件的工具。它可以用于还原被obfuscated(混淆)或加密的PHP代码,使其可读性更高...
    99+
    2023-08-24
    dezender
  • nbtscan的用法有哪些
    nbtscan是一款用于扫描和识别局域网中运行NetBIOS服务的工具。以下是nbtscan的一些常见用法:1. 扫描单个主机:nb...
    99+
    2023-08-26
    nbtscan
  • originlab的用法有哪些
    OriginLab是一款科学绘图和数据分析软件,主要用于研究人员和工程师进行数据可视化和数据分析。以下是OriginLab的一些常见...
    99+
    2023-08-26
    originlab
  • winlicense的用法有哪些
    WinLicense是一款专业的软件保护工具,用于保护和加密Windows应用程序。其主要功能和用法包括:1. 加密和保护应用程序代...
    99+
    2023-08-25
    winlicense
  • DecimalFormat的用法有哪些
    DecimalFormat是Java中用来格式化数字的类,它可以根据指定的模式将数字格式化为特定的格式。以下是使用DecimalFo...
    99+
    2024-03-08
    DecimalFormat
  • 有趣的Python用法有哪些
    这篇文章主要讲解了“有趣的Python用法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有趣的Python用法有哪些”吧!有趣的用法for-else用法循环正常结束则执行else语句。...
    99+
    2023-06-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作