我想到了這個問題,因為正如我們從檔案中知道的那樣:
useCallback(fn, deps) 等價于 useMemo(() => fn, deps)。
的檔案useMemo說:
請記住,傳遞給 useMemo 的函式在渲染期間運行。 不要在那里做任何你在渲染時通常不會做的事情。比如副作用屬于useEffect,而不是useMemo。
我認為這也意味著我不能做setState。
現在,如果我們有這個代碼:
const memoizedValue = useMemo(() => computeExpensiveValue(), []);
上面的參考是否意味著我們不能在內部computeExpensiveValue或作為引數的行內函式做副作用useMemo?
因為如果這意味著我們不能在內部執行副作用,computeExpensiveValue則意味著我們也不能在傳遞給的函式中執行副作用,useCallback因為該行與以下內容相同:
const memoizedValue = useCallback(computeExpensiveValue, []);
uj5u.com熱心網友回復:
我明白你是怎么到那里的,但這是對檔案的輕微誤讀。(相當容易犯的錯誤。)
該函式useMemo的檔案都在談論是不是你的函式(fn),它在這個功能useCallback“等效useMemo”的例子:
useMemo(() => fn, deps).
// ^^^^^^^^
該函式不呼叫任何狀態設定器,所以沒問題。
在通過useCallack. (只要您在渲染期間不呼叫回呼。)執行此操作時,請確保:
- 呼叫狀態設定器時不使用任何狀態變數:
或者const fn = useCallback(() => { setSomething(someValueNotFromState); }, []); - 使用狀態設定器的回呼形式:
或者const fn = useCallback(() => { setSomething(something => something 1); }, []); - 將您將在回呼中使用的任何狀態成員宣告為依賴項:
const fn = useCallback(() => { setSomething(something 1); // I usually avoid this }, [something]); // ^^^^^^^^^
一個更詳細的例子/比較:
const [value, setValue] = useState(0);
const changeHandler1 = useCallback((event) => {
// Absolutely fine to call `setValue` here
setValue(event.currentTarget.value);
}, []);
// equivalent to:
const changeHandler2 = useMemo(() => {
// NOT okay to call `setValue` here (the function we pass to `useMemo`)
return (event) => {
// Absolutely fine to call `setValue` here
setValue(event.currentTarget.value);
};
}, []);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347735.html
標籤:javascript 反应 反应钩子
上一篇:使用jQuery禁用元素
下一篇:型別錯誤:_app2.default.database不是函式。(在'_app2.default.database()'中,'_app2.default.database
