我正在查看 React 源代码,特别是useCallback
实现。据我了解,缓存大小useCallback
为 1。在mountCallback
我们初始化hook.memoizedState
一个数组,其中第一个元素是callback
- 的第一个参数useCallback
。如果updateCallback
依赖项没有改变,那么我们返回hook.memoizedState
数组的第一个元素。因为callback
' 的引用没有改变,所以不会重新渲染。反之,如果依赖关系发生变化,我们将hook.memoizedState
数组的第一个元素设置为then引用的callback
参数,就会发生变化(因为函数对象的参数总是有一个新值),从而触发重新渲染。updateCallback
callback
所以缓存useCallback
是基于callback
的引用。我的理解正确吗?
function mountCallback<T>(callback: T, deps: Array<mixed> | void | null): T {
const hook = mountWorkInProgressHook();
const nextDeps = deps === undefined ? null : deps;
hook.memoizedState = [callback, nextDeps];
return callback;
}
function updateCallback<T>(callback: T, deps: Array<mixed> | void | null): T {
const hook = updateWorkInProgressHook();
const nextDeps = deps === undefined ? null : deps;
const prevState = hook.memoizedState;
if (prevState !== null) {
if (nextDeps !== null) {
const prevDeps: Array<mixed> | null = prevState[1];
if (areHookInputsEqual(nextDeps, prevDeps)) {
return prevState[0];
}
}
}
hook.memoizedState = [callback, nextDeps];
return callback;
}