亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React18?useState何時(shí)執(zhí)行更新及微任務(wù)理解

 更新時(shí)間:2022年11月01日 15:14:00   作者:郎心似鐵  
這篇文章主要為大家介紹了React18?useState何時(shí)執(zhí)行更新及微任務(wù)理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

函數(shù)式組件中的useState

前言:眾所周知useState是異步的,但網(wǎng)絡(luò)上對(duì)于useState何時(shí)異步更新并沒(méi)有一個(gè)共識(shí),為了探究,做一個(gè)簡(jiǎn)單的實(shí)驗(yàn),實(shí)驗(yàn)?zāi)康氖翘骄縰seState與微任務(wù)、宏任務(wù)的先后關(guān)系

測(cè)試1

實(shí)驗(yàn)步驟:點(diǎn)擊按鈕觸發(fā)事件,在事件中我們做三件事:修改state/定義一個(gè)宏任務(wù)setTimeout /定義一個(gè)微任務(wù)promise.then ,我們?cè)谖⑷蝿?wù)中打上debugger,暫停代碼,觀察此時(shí)頁(yè)面是否更新了數(shù)據(jù)。

實(shí)驗(yàn)代碼

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

實(shí)驗(yàn)期望:

  • 如果頁(yè)面更新了,則說(shuō)明在微任務(wù)之前,useState就已經(jīng)更新了狀態(tài),并且頁(yè)面渲染完畢了
  • 如果頁(yè)面未更新,則說(shuō)明微任務(wù)在useState更新之前

實(shí)驗(yàn)結(jié)果

結(jié)果分析 結(jié)果符合第一種期望,useState在此微任務(wù)之前就完成了,由此得出useState異步更新是在微任務(wù)之前,同步代碼之后的結(jié)果,這是不準(zhǔn)確的。讓我們進(jìn)一步測(cè)試。

測(cè)試2

實(shí)驗(yàn)步驟:測(cè)試2在廁所1上調(diào)整下順序。定義宏任務(wù)/定義微任務(wù)/修改state

實(shí)驗(yàn)代碼:

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

實(shí)驗(yàn)期望

  • 如果頁(yè)面更新了,則說(shuō)明在微任務(wù)之前,useState就已經(jīng)更新了狀態(tài),并且頁(yè)面渲染完畢了
  • 如果頁(yè)面未更新,則說(shuō)明微任務(wù)在useState更新之前

實(shí)驗(yàn)結(jié)果

結(jié)果分析

微任務(wù)已經(jīng)執(zhí)行了,但是頁(yè)面還未更新,說(shuō)明useState并不一定是在微任務(wù)之前執(zhí)行。具體的執(zhí)行結(jié)果與代碼定義順序有關(guān)。

類組件中的setState

setState在promise之前定義

export default class Test extends React.Component {
    state = {
        msg: '我是初始值'
    }
    handleClick = ()=>{
        setTimeout(() => {
           console.log('宏任務(wù)') 
        }, 0);
        this.setState({
            msg: '我是更新值'
        },()=>{
            console.log('更新了msg:', this.state.msg)
        })
        Promise.resolve().then(() => {
            console.log('微任務(wù)觸發(fā)msg:', this.state.msg)
        })
    }
  render() {
    return (
      <div>
            <h2>{this.state.msg}</h2>
        <button onClick={this.handleClick}>按鈕</button>
      </div>
    )
  }
}

執(zhí)行結(jié)果:

結(jié)果說(shuō)明:當(dāng)先調(diào)用setState,后定義promise時(shí),setState會(huì)在微任務(wù)之前更新?tīng)顟B(tài)。

setState在promise之后定義

export default class Test extends React.Component {
    state = {
        msg: '我是初始值'
    }
    handleClick = ()=>{
        setTimeout(() => {
           console.log('宏任務(wù)') 
        }, 0);
        Promise.resolve().then(() => {
            console.log('微任務(wù)觸發(fā)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>
    )
  }
}

實(shí)驗(yàn)結(jié)果:

結(jié)果說(shuō)明:當(dāng)先定義promise,后調(diào)用setState時(shí),setState會(huì)在微任務(wù)之后更新?tīng)顟B(tài)。

結(jié)論

useState/setState的異步并不是一種在同步之后,微任務(wù)之前的特殊情況,而是一種和微任務(wù)相同的機(jī)制,看見(jiàn)簡(jiǎn)單理解為微任務(wù),因?yàn)樗母聲r(shí)機(jī)與微任務(wù)的調(diào)用相同,但react是不是用微任務(wù)來(lái)實(shí)現(xiàn)的更新,我不能確定。

以上就是React18 useState何時(shí)執(zhí)行更新及微任務(wù)理解的詳細(xì)內(nèi)容,更多關(guān)于React18 useState執(zhí)行更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ReactNative?狀態(tài)管理redux使用詳解

    ReactNative?狀態(tài)管理redux使用詳解

    這篇文章主要介紹了ReactNative?狀態(tài)管理redux使用詳解
    2023-03-03
  • React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié)

    React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié)

    本文主要介紹了React?useEffect異步操作常見(jiàn)問(wèn)題小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • react配置代理setupProxy.js無(wú)法訪問(wèn)v3.0版本問(wèn)題

    react配置代理setupProxy.js無(wú)法訪問(wèn)v3.0版本問(wèn)題

    這篇文章主要介紹了react配置代理setupProxy.js無(wú)法訪問(wèn)v3.0版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 基于React實(shí)現(xiàn)搜索GitHub用戶功能

    基于React實(shí)現(xiàn)搜索GitHub用戶功能

    在本篇博客中,我們將介紹如何在 React 應(yīng)用中搜索 GitHub 用戶并顯示他們的信息,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • React-Native中禁用Navigator手勢(shì)返回的示例代碼

    React-Native中禁用Navigator手勢(shì)返回的示例代碼

    本篇文章主要介紹了React-Native中禁用Navigator手勢(shì)返回的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 使用Jenkins部署React項(xiàng)目的方法步驟

    使用Jenkins部署React項(xiàng)目的方法步驟

    這篇文章主要介紹了使用Jenkins部署React項(xiàng)目的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • VSCode搭建React Native環(huán)境

    VSCode搭建React Native環(huán)境

    這篇文章主要介紹了VSCode搭建React Native環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • react-native DatePicker日期選擇組件的實(shí)現(xiàn)代碼

    react-native DatePicker日期選擇組件的實(shí)現(xiàn)代碼

    本篇文章主要介紹了react-native DatePicker日期選擇組件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解下
    2017-09-09
  • react實(shí)現(xiàn)每隔60s刷新一次接口的示例代碼

    react實(shí)現(xiàn)每隔60s刷新一次接口的示例代碼

    本文主要介紹了react實(shí)現(xiàn)每隔60s刷新一次接口的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 淺談react前后端同構(gòu)渲染

    淺談react前后端同構(gòu)渲染

    本篇文章主要介紹了淺談react前后端同構(gòu)渲染,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09

最新評(píng)論