DEV Community

João Augusto
João Augusto

Posted on

Memoize seus componentes React com eficiência

Não espere aqui um tutorial passo a passo. O objetivo é apresentar minha perspectiva sobre memoização de uma forma mais pessoal e descontraída.

O que é memoização?

Imagine que você está preparando um bolo. A cada vez que alguém pede um pedaço, você não precisa fazer um bolo novo, certo? Você simplesmente pega um pedaço do bolo que já está pronto. A memoização no React funciona de forma similar, se um componente já foi renderizado com determinadas props, não há necessidade de refazê-lo se essas props não mudaram.

Por que usar memoização?

  • Melhora o desempenho: Evita re-renderizações desnecessárias, tornando sua aplicação mais rápida e responsiva.

  • Otimiza o uso de recursos: Reduz o número de cálculos e operações realizadas pelo seu código.

  • Simplifica o raciocínio: Ajuda a entender melhor o fluxo de dados em sua aplicação.

Ferramentas de memoização no React:

  • React.memo: Memoriza componentes funcionais inteiros, evitando re-renderizações se as props não mudarem.

  • useMemo: Memoriza o resultado de uma expressão, ideal para cálculos complexos.

  • useCallback: Memoriza funções, útil quando passamos funções como props para outros componentes.

Exemplos:

1. Memoizando uma lista de itens:

import React, { memo } from 'react';

const ExpensiveList = memo(({ items }) => {
  const renderedItems = items.map(item => (
    <div key={item.id}>
      <p>Nome: {item.name}</p>
      <p>Descrição: {item.description}</p>
    </div>
  ));

  return <div>{renderedItems}</div>;
});

export default ExpensiveList;

Enter fullscreen mode Exit fullscreen mode

Neste exemplo, o componente ExpensiveList só será re-renderizado se o array items for diferente. Isso é ideal para listas longas, onde cada item pode envolver cálculos complexos ou renderizações pesadas.

2. Memoizando um cálculo complexo:

import React, { useMemo } from 'react';

function FibonacciCalculator({ n }) {
  const fibonacci = useMemo(() => {
    const fib = [0, 1];
    for (let i = 2; i <= n; i++) {
      fib[i] = fib[i - 1] + fib[i - 2];
    }
    return fib[n];
  }, [n]);

  return <div>O {n}-ésimo número de Fibonacci é: {fibonacci}</div>;
}

export default FibonacciCalculator;

Enter fullscreen mode Exit fullscreen mode

O useMemo garante que o cálculo de Fibonacci seja feito apenas quando o valor de n mudar, evitando recalcular o mesmo valor repetidamente.

3. Memoizando um callback em um formulário:

import React, { useCallback, useState } from 'react';

function Form() {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');

  const handleSubmit = useCallback((event) => {
    event.preventDefault();
    console.log('Nome:', name);
    console.log('Email:', email);
  }, [name, email]);

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Nome:
        <input
          type="text"
          value={name}
          onChange={(e) => setName(e.target.value)}
        />
      </label>
      <label>
        Email:
        <input
          type="email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        />
      </label>
      <button type="submit">Enviar</button>
    </form>
  );
}

export default Form;

Enter fullscreen mode Exit fullscreen mode

Ao memorizar handleSubmit com useCallback, garantimos que a função mantém a mesma referência enquanto name e email não mudam. Isso pode ser útil para evitar recriações desnecessárias da função em renderizações do componente, embora em um formulário simples isso não traga grandes otimizações perceptíveis.

Quando usar cada ferramenta?

  • React.memo: Ideal para componentes puros, listas longas e componentes complexos que não possuem estado interno.

  • useMemo: Utilizado para memorizar o resultado de cálculos complexos ou valores que são caros de calcular.

  • useCallback: Utilizado para memorizar funções, especialmente quando passadas como props para outros componentes.

Considerações importantes:

  • Memoize com sabedoria: A memoização pode melhorar o desempenho, mas um uso excessivo pode tornar o código mais complexo e menos legível.

  • Entenda as dependências: As dependências informadas para useMemo e useCallback são cruciais para o funcionamento correto da memoização.

  • Use as ferramentas de profiling: Utilize as ferramentas de profiling do React para identificar gargalos de desempenho e verificar se a memoização está tendo o efeito desejado.

Em resumo, memoização é uma técnica poderosa que, quando usada com parcimônia e sabedoria, pode aumentar o desempenho de suas aplicações React. Para maximizar os benefícios, lembre-se de analisar os perfis de sua aplicação e identificar os pontos onde o uso de React.memo, useMemo e useCallback pode realmente fazer a diferença.

Top comments (0)