DEV Community

Cover image for Evitando Re-renderizações Desnecessárias em React com Múltiplos Estados
Lucas Lima
Lucas Lima

Posted on

Evitando Re-renderizações Desnecessárias em React com Múltiplos Estados

É comum utilizar estados para controlar diferentes parte da interface. No entanto, se não forem bem gerenciados, múltiplos estados porem causar re-renderizações desnecessárias, afetando a performance do sistema.

Problema: Muitos estados === Muitas re-renderizações

Vamos imaginar que estamos com um componente que gerencia os dados de um usuário. Podemos declarar esses estados de forma independente, assim:

const UserComponent = () => {
  const [name, setName] = useState('');
  const [age, setAge] = useState(0);
  const [address, setAddress] = useState('');
  const [email, setEmail] = useState('');
  const [phone, setPhone] = useState('');
  const [occupation, setOccupation] = useState('');

  // Funções de atualização dos estados
  const updateName = (newName) => setName(newName);
  const updateAge = (newAge) => setAge(newAge);
  // e assim por diante...

  return (
    ...
  );
};
Enter fullscreen mode Exit fullscreen mode

Aqui a gente tem 6 estados independentes, cada vez que um desses estados é atualizado, o componente inteiro é re-renderizado, agora imagine que precisamos fazer atualização dos 6 estados... sim, a gente renderiza esse componente 6 vezes.

Solução: Criar somente 1 estado referente as informações do usuário

Uma forma de mitigar esse problema é consolidar todos os estados em um único objeto. Ao invés de ter estados separados, podemos manter todas as informações do usuário em um só estado, ficaria assim:

const UserComponent = () => {
  const [user, setUser] = useState({
    name: '',
    age: 0,
    address: '',
    email: '',
    phone: '',
    occupation: ''
  });

  // Função para atualizar o estado do usuário
  const updateUser = (newData) => {
    setUser((prevState) => ({
      ...prevUser,
      ...newData,
    }));
  };

  return (
    ...
  );
};
Enter fullscreen mode Exit fullscreen mode

Agora, ao invés de ter uma função para cada estado, temos a função updateUser, que recebe apenas as mudanças desejadas e junta com o estado anterior utilizando o spread operator (...). Isso permite atualizar apenas uma parte do estado, enquanto o restante permanece inalterado.

Se desejas alterar apenas 1 informação do objeto, você faz assim:

setUser((prevState) => ({...prevState, age: 25}))
Enter fullscreen mode Exit fullscreen mode

Diferença

Quando usamos estados separados, cada mudança de estado individual causa uma re-renderização do componente. Quando consolidamos todos os estados em um único objeto, ainda temos uma única re-renderização, mas ela ocorre apenas uma vez, mesmo que várias partes do objeto sejam alteradas.

Vantagens

- Redução de Re-renderizações: Consolidando estados, evitamos múltiplas re-renderizações desnecessárias, melhorando a performance.
- Manutenção Facilitada: Fica mais fácil gerenciar as informações do usuário em um único estado, simplificando o código e tornando-o mais legível.
- Atualizações Parcialmente Controladas: Podemos alterar apenas as partes do estado que precisam ser modificadas, sem mexer no resto.

É isso! Espero ter ajudado!!!
Apesar de que ainda estou desenvolvendo, mas ai vai o meu portfólio: https://lucaslima.vercel.app (espero que quando você acesse já esteja pronto hahhaha)

Sucesso! 🚀

Top comments (2)

Collapse
 
leonardo_hernandes_769c9a profile image
Leonardo Hernandes

It’s amazing 🤩🤩🤩

Collapse
 
miguel_dasilvaviana_d07 profile image
Miguel da Silva Viana

O cara é bravo o pele do react🚀🚀
Muito bom o artigo obrigado