Não entendi porque ganhamos performance utilizando o useMemo nessa parte do código ao invés de manter o useEffect.
Anteriormente tínhamos o useEffect com um array de dependências que incluía somente o carrinho
.
useEffect(() => {
const { totalTemp, quantidadeTemp } = carrinho.reduce(
(acumulador, produto) => ({
quantidadeTemp: acumulador.quantidadeTemp + produto.quantidade,
totalTemp: acumulador.totalTemp + produto.preco * produto.quantidade,
}),
{
quantidadeTemp: 0,
totalTemp: 0,
}
);
setQuantidade(quantidadeTemp);
setValorTotal(totalTemp);
}, [carrinho]);
Agora utilizando o useMemo também usamos apenas o carrinho
como dependência.
const { totalTemp, quantidadeTemp } = useMemo(() => {
return carrinho.reduce(
(acumulador, produto) => ({
quantidadeTemp: acumulador.quantidadeTemp + produto.quantidade,
totalTemp: acumulador.totalTemp + produto.preco * produto.quantidade,
}),
{
quantidadeTemp: 0,
totalTemp: 0,
}
);
}, [carrinho]);
Não entendi que diferença faz usar o useMemo nesse caso sendo que ele faz o cálculo a cada atualização do carrinho
, assim como o useEffect fazia anteriormente.
Atualização
Pelo que li na documentação do useMemo, a diferença seria que o useMemo não roda o cálculo novamente quando o array de dependências não mudou, apenas envia o resultado anterior, o que nos daria um ganho de performance. É isso mesmo?