useMemo

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

mount

mountMemo 两个参数,一个 nextCreate 函数和 deps,它创建了一个 hook,并将 nextCreate 函数执行的返回值和 deps 作为数组存入 hook 的缓存中。

最后返回 nextCreate 函数执行的结果。

function mountMemo<T>(
  nextCreate: () => T,
  deps: Array<mixed> | void | null,
): T {
  const hook = mountWorkInProgressHook();
  const nextDeps = deps === undefined ? null : deps;
  const nextValue = nextCreate();
  hook.memoizedState = [nextValue, nextDeps];
  return nextValue;
}

update

useMemo 在组件更新时会检查前后两次传入的 deps 是否按序相等。 如果相等,则返回之前存储的 nextCreate 的执行结果;如果不等,则会重新计算该值,并将最新的结果和新的 deps 进行缓存。最后返回这个新的计算结果。

function updateMemo<T>(
  nextCreate: () => T,
  deps: Array<mixed> | void | null,
): T {
  const hook = updateWorkInProgressHook();
  const nextDeps = deps === undefined ? null : deps;
  const prevState = hook.memoizedState;
  if (prevState !== null) {
    // Assume these are defined. If they're not, areHookInputsEqual will warn.
    if (nextDeps !== null) {
      const prevDeps: Array<mixed> | null = prevState[1];
      if (areHookInputsEqual(nextDeps, prevDeps)) {
        return prevState[0];
      }
    }
  }
  const nextValue = nextCreate();
  hook.memoizedState = [nextValue, nextDeps];
  return nextValue;
}

useCallback(fn, deps) 等同于 useMemo(() => fn, deps)

传递给useMemo的函数在渲染过程中运行。不要做那些在渲染时通常不会做的事情。例如,副作用属于useEffect,而不是useMemo。

results matching ""

    No results matching ""