[英]Understanding Code Flow For Setting State in React
我有這個基本代碼,它從處理程序更新 state:
const wait = (ms) => {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
};
export default function App() {
async function handleClick() {
setData(1);
console.log("first click");
console.log(data);
await wait(1000);
setData(2);
console.log("second click");
console.log(data);
}
const [data, setData] = React.useState(0);
return (
<div>
{data}
<button onClick={() => handleClick(setData)}>Click Me</button>
</div>
);
}
我正在嘗試了解操作順序,有人可以驗證或指出正在發生的事情的正確方向嗎? 我已經進行了研究,但還沒有找到關於我認為正在發生的事情的決定性來源。
setData(1)
,將任務排入事件循環console.log('first click')
運行setData(2)
入隊另一個任務這一切都正確嗎? 我誤解了什么嗎? 謝謝你的幫助。
是的,你已經正確地記下了這個,除了可能的一點
運行
setData(1)
,將任務排入事件循環
這可能涉及也可能不涉及事件循環。 setData
中發生的事情特定於 react.js,並且不一定會在瀏覽器事件循環中排隊任務。 它確實“以某種方式”安排組件的 state 更新和重新渲染 - 在反應中。
如果我沒記錯的話,react.js 確實安排了由setData(1)
引起的渲染到本機點擊處理程序的末尾,即當對onClick
處理程序的調用返回以響應代碼時。 對於setData(2)
,渲染實際上可能在setData
調用中同步發生,因為 React 不控制上下文。 然而,這可能會發生變化(開發人員正在討論異步地將多個更新批處理在一起)並且應該被視為一個實現細節。 如果您好奇,只需在組件的渲染 function 中放置一個console.log
,但不要編寫任何依賴於此測試中觀察到的順序的代碼!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.