Otimizando o Desempenho com o Hook useMemo
O hook useMemo permite memorizar o resultado de uma função, otimizando cálculos custosos ao armazenar o resultado em cache. É vantajoso quando há cálculos frequentes e que consomem muitos recursos, mas que produzem o mesmo resultado quando os dados não mudam. Isso elimina a necessidade de recálculos redundantes, resultando em melhor desempenho.
Sintaxe:
Declara-se uma nova variável, como cachedValue, e atribui-se a ela o hook useMemo. Dentro dos parênteses do hook, fornece-se uma função (por exemplo, calculateValue), que será executada para calcular o valor memorizado. Essa função pode ser qualquer função JavaScript válida. Além disso, inclui-se um segundo argumento—um array chamado dependencies—que consiste nos valores dos quais o valor memorizado depende.
const cachedValue = useMemo(calculateValue, dependencies)
Quando qualquer dependência especificada no array dependencies for alterada, o valor memorizado será recalculado. No entanto, se as dependências permanecerem as mesmas entre renderizações, o React retornará o valor previamente calculado sem novo cálculo.
Note
Essa otimização contribui para melhorar o desempenho ao evitar cálculos desnecessários, resultando em uma experiência de usuário mais eficiente.
Exemplo 1
Vamos criar o componente ShoppingCart, que irá armazenar as informações sobre a quantidade de produtos selecionados pelo usuário. Além disso, ele irá gerenciar a lógica para calcular o valor total, indicando o valor que o usuário deve pagar. Nosso objetivo principal é memorizar o valor total e recalculá-lo apenas quando o usuário modificar a prop products passada para este componente.
import React, { useMemo } from "react";
const ShoppingCart = ({ products }) => {
const totalPrice = useMemo(() => {
let sum = 0;
for (const item of products) {
sum += item.price * item.quantity;
}
return sum;
}, [products]);
return (
<div>
<h2>Shopping Cart</h2>
<ul>
{products.map(({ id, name, price, quantity }) => (
<li key={id}>
<p>
<span>{name} -</span>
<span>
${price} x {quantity}
</span>
</p>
</li>
))}
</ul>
<h3>
Total Price: <span>${totalPrice}</span>
</h3>
</div>
);
};
O cálculo do totalPrice é realizado dentro do hook useMemo, o que evita recálculos desnecessários a cada nova renderização do componente.
Explicação linha por linha:
- Linha 1: Importação do hook
useMemoda biblioteca React para utilizar sua funcionalidade; - Linha 3: Definição do componente
ShoppingCartutilizando a sintaxe convencional de função; - Linhas 4-10: Criação da variável
totalPrice, responsável pelo valor total que o usuário deve pagar. O hookuseMemoé utilizado para evitar cálculos em cada renderização;- Linhas 5-9: Dentro da arrow function passada para o
useMemo, é implementada a lógica para calcular osumtotal. Cada item do arrayproductsé percorrido, multiplicando o preço pelaquantitye somando ao valor da variávelsum; - Linha 10: O array de dependências
[products]é fornecido ao hookuseMemo. Isso indica que o valor memorizado deve ser recalculado caso o arrayproductsseja alterado.
- Linhas 5-9: Dentro da arrow function passada para o
- Linhas 12-31: Renderização da marcação do componente.
- Linha 16: O método
mapé utilizado para renderizar cada produto do arrayproducts, criando o elemento JSX correspondente; - Linha 17: O atributo
keyé definido para garantir a renderização eficiente dos itens do array e ajudar o React a identificar cada item de forma única; - Linha 28: O valor da variável
totalPriceé exibido dentro do JSX, mostrando o valor total calculado.
Código completo do aplicativo:
Nota
É recomendável não misturar os hooks
useEffecteuseMemopara garantir clareza e evitar confusão. A principal diferença está em seus respectivos propósitos:useEffecté utilizado para gerenciar efeitos colaterais e o ciclo de vida do componente, enquantouseMemomemoriza cálculos custosos para melhorar o desempenho.
1. Qual é o principal objetivo do hook useMemo no React?
2. Quando o hook useMemo recalcula seu valor memorizado?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Can you explain when I should use useMemo instead of useEffect?
What are some common mistakes to avoid when using useMemo?
Can you show another example of useMemo in a different context?
Awesome!
Completion rate improved to 2.17
Otimizando o Desempenho com o Hook useMemo
Deslize para mostrar o menu
O hook useMemo permite memorizar o resultado de uma função, otimizando cálculos custosos ao armazenar o resultado em cache. É vantajoso quando há cálculos frequentes e que consomem muitos recursos, mas que produzem o mesmo resultado quando os dados não mudam. Isso elimina a necessidade de recálculos redundantes, resultando em melhor desempenho.
Sintaxe:
Declara-se uma nova variável, como cachedValue, e atribui-se a ela o hook useMemo. Dentro dos parênteses do hook, fornece-se uma função (por exemplo, calculateValue), que será executada para calcular o valor memorizado. Essa função pode ser qualquer função JavaScript válida. Além disso, inclui-se um segundo argumento—um array chamado dependencies—que consiste nos valores dos quais o valor memorizado depende.
const cachedValue = useMemo(calculateValue, dependencies)
Quando qualquer dependência especificada no array dependencies for alterada, o valor memorizado será recalculado. No entanto, se as dependências permanecerem as mesmas entre renderizações, o React retornará o valor previamente calculado sem novo cálculo.
Note
Essa otimização contribui para melhorar o desempenho ao evitar cálculos desnecessários, resultando em uma experiência de usuário mais eficiente.
Exemplo 1
Vamos criar o componente ShoppingCart, que irá armazenar as informações sobre a quantidade de produtos selecionados pelo usuário. Além disso, ele irá gerenciar a lógica para calcular o valor total, indicando o valor que o usuário deve pagar. Nosso objetivo principal é memorizar o valor total e recalculá-lo apenas quando o usuário modificar a prop products passada para este componente.
import React, { useMemo } from "react";
const ShoppingCart = ({ products }) => {
const totalPrice = useMemo(() => {
let sum = 0;
for (const item of products) {
sum += item.price * item.quantity;
}
return sum;
}, [products]);
return (
<div>
<h2>Shopping Cart</h2>
<ul>
{products.map(({ id, name, price, quantity }) => (
<li key={id}>
<p>
<span>{name} -</span>
<span>
${price} x {quantity}
</span>
</p>
</li>
))}
</ul>
<h3>
Total Price: <span>${totalPrice}</span>
</h3>
</div>
);
};
O cálculo do totalPrice é realizado dentro do hook useMemo, o que evita recálculos desnecessários a cada nova renderização do componente.
Explicação linha por linha:
- Linha 1: Importação do hook
useMemoda biblioteca React para utilizar sua funcionalidade; - Linha 3: Definição do componente
ShoppingCartutilizando a sintaxe convencional de função; - Linhas 4-10: Criação da variável
totalPrice, responsável pelo valor total que o usuário deve pagar. O hookuseMemoé utilizado para evitar cálculos em cada renderização;- Linhas 5-9: Dentro da arrow function passada para o
useMemo, é implementada a lógica para calcular osumtotal. Cada item do arrayproductsé percorrido, multiplicando o preço pelaquantitye somando ao valor da variávelsum; - Linha 10: O array de dependências
[products]é fornecido ao hookuseMemo. Isso indica que o valor memorizado deve ser recalculado caso o arrayproductsseja alterado.
- Linhas 5-9: Dentro da arrow function passada para o
- Linhas 12-31: Renderização da marcação do componente.
- Linha 16: O método
mapé utilizado para renderizar cada produto do arrayproducts, criando o elemento JSX correspondente; - Linha 17: O atributo
keyé definido para garantir a renderização eficiente dos itens do array e ajudar o React a identificar cada item de forma única; - Linha 28: O valor da variável
totalPriceé exibido dentro do JSX, mostrando o valor total calculado.
Código completo do aplicativo:
Nota
É recomendável não misturar os hooks
useEffecteuseMemopara garantir clareza e evitar confusão. A principal diferença está em seus respectivos propósitos:useEffecté utilizado para gerenciar efeitos colaterais e o ciclo de vida do componente, enquantouseMemomemoriza cálculos custosos para melhorar o desempenho.
1. Qual é o principal objetivo do hook useMemo no React?
2. Quando o hook useMemo recalcula seu valor memorizado?
Obrigado pelo seu feedback!