91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React?setState異步原理是什么

發布時間:2022-11-18 09:23:03 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“React setState異步原理是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“React setState異步原理是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    setState異步更新

    開發中當組件中的狀態發生了變化,頁面并不會重新渲染。我們必須要通過setState來告知React數據已經發生了變化,重新渲染頁面。

    先來看下面的例子:

    constructor() {
        super();
        this.state = {
          message: "Hello World",
        };
    }
    changeText() {
       this.setState({
          message: "Hello React",
       });
       console.log(this.state.message); // Hello World
    }

    最終打印的結果是Hello World;

    可見setState是異步的操作,我們并不能在執行完setState之后立馬拿到最新的state的結果

    那么為什么setState設計為異步呢?

    setState設計為異步,可以顯著的提升性能

    • 如果每次調用setState都進行一次更新,那么意味著render函數會被頻繁調用,界面重新渲染,這樣效率是很低的;

    • 最好的辦法是獲取多個更新,之后進行批量處理;

    如果同步更新了state,但是還沒有執行render函數,那么state和props不能保持同步;

    state和props不能保持一致性,會在開發中產生很多的問題;(比如,組件嵌套時影響子組件中的狀態)

    如何獲取異步的結果

    setState的回調

    setState接受兩個參數:第二個參數是一個回調函數,這個回調函數會在更新后會執行;

    changeText() {
        this.setState({
          message: "Hello React",
        },()=>{
            console.log('-----',this.state.message); // Hello React
        });
      }

    也可以在生命周期函數中獲取:

       componentDidUpdate(prevProps, prevState, snapshot){
       console.log(this.state.message);// Hello React
       }

    setState一定是異步的嗎?

    React18版本之前

    其實可以分成兩種情況:

    • 在組件生命周期或React合成事件中,setState是異步的;

    • 在setTimeout或者原生DOM事件中,setState是同步的

    驗證一:在setTimeout中的更新:

    setTimeout(() => {
          this.setState({
            message: "Hello React",
          });
          console.log(this.state.message); // Hello React
     }, 0);

    驗證二:原生DOM事件:

    componentDidMount() {
        const btnEl = document.querySelector("#btn");
        btnEl.addEventListener("click", () => {
          this.setState({
            message: "Hello React",
          });
          console.log(this.state.message); // Hello React
        });
      }

    React18版本之后

    setState默認是異步的

    • 在React18之后,默認所有的操作都被放到了批處理中(異步處理)

    React?setState異步原理是什么

    如果希望代碼可以同步拿到,則需要執行特殊的flushSync操作:

    import { flushSync } from "react-dom";
    changeText() {
        flushSync(() => {
          this.setState({
            message: "Hello React",
          });
        });
        console.log(this.state.message); // Hello React
      }

    讀到這里,這篇“React setState異步原理是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    肇东市| 扎兰屯市| 女性| 新龙县| 兴海县| 琼结县| 赤壁市| 霍山县| 金秀| 禹州市| 上栗县| 阿拉善盟| 永春县| 西乡县| 乐昌市| 辉县市| 道孚县| 西乌| 通辽市| 桃源县| 喀喇| 固原市| 西安市| 申扎县| 府谷县| 红河县| 津市市| 正安县| 高州市| 莒南县| 剑河县| 阿瓦提县| 龙里县| 合阳县| 西充县| 汕头市| 蛟河市| 靖州| 山阳县| 淮滨县| 五河县|