在它的檔案中useEffect()顯示了以下示例:
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
}
然后它說:
有經驗的 JavaScript 開發人員可能會注意到傳遞給的函式
useEffect在每次渲染時都會有所不同。這是故意的。事實上,這讓我們可以count從效果內部讀取值,而不必擔心它會過時。每次重新渲染時,我們都會安排不同的效果,替換之前的效果。
我不明白為什么count里面會變得陳舊,useEffect()因為它useEffect已經count關閉了。既然useEffect()是一個鉤子,它不應該總是可以訪問最新的狀態變數嗎?另外,一般來說,我如何確保我始終擁有狀態變數的最新值?
uj5u.com熱心網友回復:
我不明白為什么 count 會在 useEffect() 中變得陳舊,因為 useEffect 在其關閉中具有 count 。
請記住,這Example將被多次呼叫,每次渲染一次。所以有 N 個渲染、Ncount個變數和 N 個 useEffect 函式。所以確實每個效果函式都有count它的閉包,但它們每個都有一個特定 count的閉包。無論在創建閉包時它具有什么值,這就是它在效果運行時將具有的值。如果您只創建了一次函式,關閉了 的第一個值count,那么該代碼將只能看到 的第一個值count(即 0)。
另外,一般來說,我如何確保我始終擁有狀態變數的最新值?
如果您正在設定狀態,那么您始終可以使用 setState 的函式版本訪問最新值。例如:
setCount(prev => /* calculate new state from prev */)`
對于其他情況,可以在 useEffect 的依賴陣列中包含狀態,以便在計數更改時重新運行效果:
useEffect(() => {
// some code that uses `count`
}, [count]);
如果您希望效果在每個渲染上運行,或者完全關閉依賴陣列。
useEffect(() => {
// some code that uses `count`
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/469113.html
