Descobrindo o useCallback do React

marcellevargas

Marcelle Vargas

Posted on October 28, 2024

Descobrindo o useCallback do React

Existem vários hooks do React e recentemente estudando achei que esse hook merece uma atenção maior da minha parte.

Mas antes de entrar efetivamente no que seria o useCallback, vamos começar com uma pergunta anterior. O que seria um hook ?

O que é um hook ?

Hooks de forma informal, podemos dizer que seriam os “componentes” das regras de negócio. Quando você precisa executar a mesma lógica em mais de um lugar, você pode isolar essa lógica em um hook e chamar ela em qualquer área do seu sistema. Essa conceito também pode ser extendido aos hooks nativos do React.

Agora que entendemos que hooks são lógicas encapsuladas para serem reutilizadas nós podemos ir para o segundo tópico necessário para entender o useCallback que é o processo de renderização do React.

Como o React.js renderiza os componentes?

O React introduziu de forma muito eficiente o padrão de arquitetura de componentização, onde cada parte da sua interface pode ser isolada e reaproveitada no sistema. Isso facilitou muito a organização e a manutenção de sistemas web, para você renderizar esses componentes eles precisam ser chamados em um componente pai que se comporta como a sua página.

Até o momento esse cenário não é ruim, mas você ainda não consegue resolver o problema de performance pois a cada alteração de estado você precisar atualizar toda a página. E para resolver isso existem outras abordagens dependendo do contexto, mas hoje vamos trazer um destaque para o useCallback.

Enfim, o que o useCallback faz ?

Basicamente ele é um hook que cria um cache da sua função e evita que ela seja recriada sem necessidade pois ela só vai ser executada novamente quando houver uma alteração em uma das dependências (assim como o useEffect faz).

Exemplo com código

Vamos criar um código de contador aonde o usuário pode clicar em um botão para incrementar um valor e também aumentar o valor do intervalo.

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

const ChildComponent = React.memo(({ onIncrement }) => {
  console.log("ChildComponent renderizado");
  return (
    <div>
      <button onClick={onIncrement}>Incrementar no Filho</button>
    </div>
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithoutCallback = () => {
    setCount((prevCount) => prevCount + incrementStep);
  };

  console.log("ParentComponent renderizado");

  return (
    <div>
      <h1>Contador: {count}</h1>

      <h2>Sem useCallback</h2>
      <ChildComponent onIncrement={incrementWithoutCallback} />

      <button onClick={() => setOtherState(!otherState)}>
        Toggle Other State
      </button>

      <button onClick={() => setIncrementStep((prev) => prev + 1)}>
        Aumentar Passo de Incremento
      </button>
    </div>
  );
}

export default ParentComponent;
Enter fullscreen mode Exit fullscreen mode

No exemplo de cima, o componente filho é renderizado a cada alteração que acontece no componente pai


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

const ChildComponent = React.memo(({ onIncrement }) => {
  console.log("ChildComponent renderizado");
  return (
    <div>
      <button onClick={onIncrement}>Incrementar no Filho</button>
    </div>
  );
});

function ParentComponent() {
  const [count, setCount] = useState(0);
  const [otherState, setOtherState] = useState(false);
  const [incrementStep, setIncrementStep] = useState(1);

  const incrementWithCallback = useCallback(() => {
    setCount((prevCount) => prevCount + incrementStep);
  }, [incrementStep]);

  console.log("ParentComponent renderizado");

  return (
    <div>
      <h1>Contador: {count}</h1>

      <h2>Com useCallback</h2>
      <ChildComponent onIncrement={incrementWithCallback} />

      <button onClick={() => setOtherState(!otherState)}>
        Toggle Other State
      </button>

      <button onClick={() => setIncrementStep((prev) => prev + 1)}>
        Aumentar Passo de Incremento
      </button>
    </div>
  );
}

export default ParentComponent;
Enter fullscreen mode Exit fullscreen mode

Quando usamos o useCallback ele só irá atualizar o componente filho quando a dependência sofrer uma alteração

Espero que esse texto tenha te ajudado a entender melhor como funciona o useCallback.

Oi, meu nome é Marcelle e eu sou desenvolvedora web :)

Eu trabalho com tecnologia desde 2016, mas eu sou apaixonada pelo que faço. Por isso eu estou sempre estudando e compartilhando as minhas anotações de estudo em forma de artigo.

marcellevargas - Overview

💖 💪 🙅 🚩
marcellevargas
Marcelle Vargas

Posted on October 28, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

useContext: React Hooks
react useContext: React Hooks

November 8, 2024

Descobrindo o useCallback do React
hooks Descobrindo o useCallback do React

October 28, 2024

useReducer: React Hooks
react useReducer: React Hooks

November 8, 2024

Top 2 React Hooks
react Top 2 React Hooks

September 25, 2024