首页IT科技reaction怎么读英语发音(React18 useState何时执行更新及微任务理解)

reaction怎么读英语发音(React18 useState何时执行更新及微任务理解)

时间2025-06-20 13:19:07分类IT科技浏览4008
导读:函数式组件中的useState 前言:众所周知useState是异步的,但网络上对于useState何时异步更新并没有一个共识,为了探究,做一个简单的实验,实验目的是探究useState与微任务、宏任务的先后关系...

函数式组件中的useState

前言:众所周知useState是异步的,但网络上对于useState何时异步更新并没有一个共识           ,为了探究                  ,做一个简单的实验      ,实验目的是探究useState与微任务            、宏任务的先后关系

测试1

实验步骤:点击按钮触发事件           ,在事件中我们做三件事:修改state/定义一个宏任务setTimeout /定义一个微任务promise.then                  ,我们在微任务中打上debugger      ,暂停代码     ,观察此时页面是否更新了数据           。

实验代码

import React, { useState } from react export default function Test() { const [msg, setMsg] = useState(我是初始值) const onChange = () => { setMsg(我是更新值) setTimeout(() => { console.log(宏任务) }, 0); Promise.resolve().then(res=>{ debugger console.log(微任务) }) } return ( <div> <h2>{msg}</h2> <button onClick={onChange}>按钮</button> </div> ) }

实验期望:

如果页面更新了                  ,则说明在微任务之前            ,useState就已经更新了状态     ,并且页面渲染完毕了 如果页面未更新                 ,则说明微任务在useState更新之前

实验结果

结果分析 结果符合第一种期望            ,useState在此微任务之前就完成了,由此得出useState异步更新是在微任务之前                 ,同步代码之后的结果                  ,这是不准确的                  。让我们进一步测试      。

测试2

实验步骤:测试2在厕所1上调整下顺序           。定义宏任务/定义微任务/修改state

实验代码:

import React, { useState } from react export default function Test() { const [msg, setMsg] = useState(我是初始值) const onChange = () => { setTimeout(() => { console.log(宏任务) }, 0); Promise.resolve().then(res=>{ debugger console.log(微任务) }) setMsg(我是更新值) } return ( <div> <h2>{msg}</h2> <button onClick={onChange}>按钮</button> </div> ) }

实验期望

如果页面更新了,则说明在微任务之前           ,useState就已经更新了状态                  ,并且页面渲染完毕了 如果页面未更新      ,则说明微任务在useState更新之前

实验结果

结果分析

微任务已经执行了           ,但是页面还未更新                  ,说明useState并不一定是在微任务之前执行                  。具体的执行结果与代码定义顺序有关      。

类组件中的setState

setState在promise之前定义

export default class Test extends React.Component { state = { msg: 我是初始值 } handleClick = ()=>{ setTimeout(() => { console.log(宏任务) }, 0); this.setState({ msg: 我是更新值 },()=>{ console.log(更新了msg:, this.state.msg) }) Promise.resolve().then(() => { console.log(微任务触发msg:, this.state.msg) }) } render() { return ( <div> <h2>{this.state.msg}</h2> <button onClick={this.handleClick}>按钮</button> </div> ) } }

执行结果:

结果说明:当先调用setState      ,后定义promise时     ,setState会在微任务之前更新状态     。

setState在promise之后定义

export default class Test extends React.Component { state = { msg: 我是初始值 } handleClick = ()=>{ setTimeout(() => { console.log(宏任务) }, 0); Promise.resolve().then(() => { console.log(微任务触发msg:, this.state.msg) }) this.setState({ msg: 我是更新值 }, () => { console.log(更新了msg:, this.state.msg) }) } render() { return ( <div> <h2>{this.state.msg}</h2> <button onClick={this.handleClick}>按钮</button> </div> ) } }

实验结果:

结果说明:当先定义promise                  ,后调用setState时            ,setState会在微任务之后更新状态                  。

结论

useState/setState的异步并不是一种在同步之后     ,微任务之前的特殊情况                 ,而是一种和微任务相同的机制            ,看见简单理解为微任务,因为它的更新时机与微任务的调用相同                 ,但react是不是用微任务来实现的更新                  ,我不能确定            。

以上就是React18 useState何时执行更新及微任务理解的详细内容,更多关于React18 useState执行更新的资料请关注本站其它相关文章!

声明:本站所有文章           ,如无特殊说明或标注                  ,均为本站原创发布     。任何个人或组织      ,在未征得本站同意时           ,禁止复制                 、盗用      、采集      、发布本站内容到任何网站                 、书籍等各类媒体平台                 。如若本站内容侵犯了原著者的合法权益                  ,可联系我们进行处理            。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
vue的自定义组件(vue中如何在自定义组件上使用v-model和.sync)