Nesta edição do GitHub, propus essencialmente mudar:
x = useCallback( ... , []);
Para:
x = useRef( ... ).current;
Os dois são iguais, mas com useRef
React não compara as dependências.
Para o qual uma resposta veio com uma pergunta:
Existe alguma situação em que useMemo ou useCallback sem dependência seja uma escolha melhor que useRef?
Não consigo pensar em um, mas posso ter esquecido alguns casos de uso.
Então, alguém pode pensar em tal situação?
useCallback(x,[])
parauseRef(x)
funciona da mesma maneira.useRef(x).current
isso é.useCallback(cb, [])
vsuseRef(cb).current
mim. EmborauseMemo(cb, [])
seja diferenteuseRef(cb).current
no sentido em queuseMemo
"apenas recalculará o valor memorizado quando uma das dependências for alterada". VersususeRef
que sempre recalcula o valor, não importa o quê.useRef
nunca recalcula - sempre retorna o valor inicial.Embora você possa usar useRef para emular useCallback ou com uma dependência vazia, você não pode usá-lo para todos os cenários possíveis de useCallback, que devem ser rememoizados quando qualquer uma das dependências mudar.
Além disso, não fará muita diferença de desempenho se você usar
useCallback with empty dependency
ou usar o Ref, pois ele não precisa realizar nenhuma comparação pesada.Além disso, se você alterar um pouco a implementação da função para recriá-la em uma alteração de parâmetro específica, basta atualizar a implementação
useCallback
e adicionar os parâmetros extras como dependência. No entanto, se você implementá-lo com useRef, precisará reverter parauseCallback
fonte
Como a saída da corrente useRef (() => {...}). É mutável.
O que pode causar efeitos colaterais estranhos no seu código. Eu posso alterar o valor da corrente a qualquer momento. https://codesandbox.io/s/confident-monad-vjeuw
Esse seria o caso de uso para não querer usar useRef
fonte
x = useRef(value).current
nunca retorna instâncias mutáveis -ref
nunca é retornado;current
é. É o mesmo que com auseCallback
versão.