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

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

时间2025-05-04 05:32:09分类IT科技浏览3392
导读:函数式组件中的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
html头部代码(【HTML+CSS+JavaScript】网页实战开发笔记之一——HTML的头部信息里你不知道的事) win7电脑c盘满了怎么清理技巧(win7系统电脑c盘满了的清理方法)