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

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

时间2025-09-19 14:58:47分类IT科技浏览5014
导读:函数式组件中的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
高亮显示行和列(Vxe-table 高亮当前行)