R
Interview Deckreact · next.js · senior/staff
0·0·122
Performance

React.memo + areEqual

Evita re-renders comparando props por valor, não por referência.

React.memo é um Higher-Order Component (HOC) que memoiza um componente funcional. Por padrão, faz comparação rasa (===) das props. O segundo argumento (areEqual) permite comparação customizada — útil quando props são objetos/arrays.

Problema
Componente re-renderiza mesmo que os dados não mudaram — apenas a referência do objeto mudou.
Solução
Usar React.memo com função areEqual customizada para comparar valores reais, não referências.
Tip
Use areEqual customizado quando suas props são objetos ou arrays. Para primitivos, React.memo padrão já basta.
// ❌ Problema: novo objeto a cada render = nova ref = re-render
const user = { name: "Felipe" }; // recriado todo render

// ✅ Solução: React.memo + comparador de valor
const UserCard = React.memo(
  ({ user }) => <div>{user.name}</div>,

  (prevProps, nextProps) => {
    // true = NÃO re-renderiza
    return prevProps.user.name === nextProps.user.name
        && prevProps.user.id === nextProps.user.id;
  }
);
Q.Qual a diferença entre React.memo, useMemo e useCallback?
A.React.memo memoiza o COMPONENTE inteiro (evita re-render). useMemo memoiza um VALOR computado (cache de cálculo). useCallback memoiza uma FUNÇÃO (mantém a mesma referência entre renders). Os três usam comparação rasa por padrão.
Q.React.memo sempre melhora performance?
A.Não. Tem custo próprio (a comparação roda a cada render do pai). Se o componente é trivial ou recebe props sempre diferentes, memo piora a performance. Sempre meça com React Profiler antes de aplicar.
Q.O que é comparação rasa?
A.Comparação por referência (===) para objetos/arrays e por valor para primitivos. { a: 1 } === { a: 1 } é false (referências diferentes), mas 1 === 1 é true.
1/122← →