我正在查看 React 源代码,特别是useCallback
实现。据我了解,useCallback
的缓存大小是一个。mountCallback
我们将hook.memoizedState
初始化为一个数组,其中第一个元素是callback
- 要useCallback
的第一个参数。updateCallback
如果依赖项没有更改,则返回hook.memoizedState
数组的第一个元素。因为callback
的引用没有改变,所以不会重新渲染。相反,如果依赖项发生了变化,并且我们将数组的第一个元素设置为updateCallback
的callback
参数hook.memoizedState
则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;
}
它缓存callback
本身以及作为第二个参数传递的依赖值。在任何时间点,它都包含一个callback
引用和一个相关值数组。
它需要依赖值来检查是否应创建新的回调引用。