Existem dois tipos de circunstâncias: montagem e atualização, então useMemo tem duas implementações: mountMemo e updateMemo.
function mountMemo( nextCreate: () => T, deps: Array | void | null, ): T { const hook = mountWorkInProgressHook(); const nextDeps = deps === undefined ? null : deps; const nextValue = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); nextCreate(); setIsStrictModeForDevtools(false); } hook.memoizedState = [nextValue, nextDeps]; return nextValue; }
Explicação:
Na fase de montagem, a função useMemo chama a função de retorno de chamada para calcular e retornar o valor. Salve o valor e as dependências em hook.memoizedState.
Use mountWorkInProgressHook para criar um objeto de gancho.
Salvar dependências em nextDeps.
Chame nextCreate() para obter nextValue. Se estiver em um ambiente de desenvolvimento, ligue duas vezes.
Salve o nextValue e nextDeps no hook.memoizedState e retorne nextValue.
function updateMemo( nextCreate: () => T, deps: Array | void | null, ): T { const hook = updateWorkInProgressHook(); const nextDeps = deps === undefined ? null : deps; const prevState = hook.memoizedState; // Assume these are defined. If they're not, areHookInputsEqual will warn. if (nextDeps !== null) { const prevDeps: Array | null = prevState[1]; if (areHookInputsEqual(nextDeps, prevDeps)) { return prevState[0]; } } const nextValue = nextCreate(); if (shouldDoubleInvokeUserFnsInHooksDEV) { setIsStrictModeForDevtools(true); nextCreate(); setIsStrictModeForDevtools(false); } hook.memoizedState = [nextValue, nextDeps]; return nextValue; }
Explicação:
Na fase de atualização, o React julgará se os deps foram alterados ou não; se alterados, o React executará o callback para obter o novo valor e retornar. Se não for alterado, o React retornará o valor antigo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3