useCallback 和 useMemo react hook 的缓存大小是多少,为什么?



我正在查看 React 源代码,特别是useCallback实现。据我了解,useCallback的缓存大小是一个。mountCallback我们将hook.memoizedState初始化为一个数组,其中第一个元素是callback- 要useCallback的第一个参数。updateCallback如果依赖项没有更改,则返回hook.memoizedState数组的第一个元素。因为callback的引用没有改变,所以不会重新渲染。相反,如果依赖项发生了变化,并且我们将数组的第一个元素设置为updateCallbackcallback参数hook.memoizedStatecallback的引用将更改(因为函数对象参数始终具有新值(,因此触发重新渲染。

所以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引用和一个相关值数组。

它需要依赖值来检查是否应创建新的回调引用。

相关内容

  • 没有找到相关文章

最新更新