簡體   English   中英

我不知道為什么 state 會這樣更新?

[英]I have no idea why state updated like this?

我只知道使用useState的 state 時更新,觸發組件及其子組件也重新渲染。 但是當寫下這段代碼時,不知何故會像這個控制台日志一樣更新。

import { useState } from 'react';
import logo from './logo.svg';
import './App.css';
import { ChildA } from './ChildA.jsx';
import { ChildB } from './ChildB.jsx';


function App() {
  console.log('Parent render!')
  const [countA, setCountA] = useState(0);
  const [countB, setCountB] = useState(0);

  const asyncJustReturnNull = async () => {
    return null;
  }

  const countUpDouble = () => {
    setCountA(countA + 1);
    asyncJustReturnNull().then(() => {
      setCountA(countA + 1);
      setCountB(countB + 1);
    })
  }

  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <button onClick={() => countUpDouble()}>
          Update A and B at the same time.
        </button>
        <ChildA />
        countA is {countA}
        <ChildB />
        countB is {countB}
      </header>
    </div>
  );
}

export default App;

在此處輸入圖像描述

CodePen 如下。 https://codepen.io/showgotagami/pen/qBaBveG

因為當你打電話

setCountA(countA + 1);
justReturnNull().then(() => {
    setCountA(countA + 1);
    setCountB(countB + 1);
})

countA時,它的值都相同(最初為 0)。 那是因為setCountA實際上是異步的,不會立即改變countA的值。

一種更好地可視化的方法可能是這樣的:

const incrementA = () => {
    console.log(countA);
    setCountA(countA + 1);
}

const updateBoth = () => {
    incrementA();
    justReturnNull().then(() => {
        incrementA();
        setCountB(countB + 1);
    })
};

這樣我們就不再傳遞countA了。

一句話:

"State Updates are Merged"

它們同時發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM