🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

Perguntas da entrevista React 2026: ganchos, componentes de servidor e desempenho

⏱️5 min read  ·  954 words

As perguntas da entrevista do React em 2026 cobrem ganchos, gerenciamento de estado, otimização de desempenho, novos recursos do React 19 e padrões TypeScript. Este guia cobre as perguntas mais comuns sobre React, tanto nos níveis júnior quanto sênior.

Perguntas principais de reação

1. O que é o DOM virtual e como funciona a reconciliação?

O DOM virtual é uma representação JavaScript leve do DOM real. Quando o estado muda:

  1. React cria uma nova árvore DOM virtual
  2. Algoritmo de comparação compara DOM virtual novo e anterior
  3. Apenas nós alterados são atualizados no DOM real
  4. Este lote de atualizações torna o React um desempenho

O React 18+ usa renderização simultânea – pode pausar, interromper e retomar a renderização, priorizando atualizações urgentes.

2. Explique useEffect e suas armadilhas comuns

import { useEffect, useState } from 'react';

function UserProfile({ userId }: { userId: number }) {
  const [user, setUser] = useState<User | null>(null);

  // Correct: cleanup function + proper dependencies
  useEffect(() => {
    let cancelled = false;  // prevent stale closure

    async function fetchUser() {
      const data = await api.getUser(userId);
      if (!cancelled) setUser(data);  // only update if still mounted
    }

    fetchUser();

    return () => { cancelled = true; };  // cleanup
  }, [userId]);  // dependency array

  // PITFALL 1: missing dependency
  // useEffect(() => { fetchUser(userId); }, []);
  // This won't re-run when userId changes!

  // PITFALL 2: object/array in deps (new reference every render)
  // useEffect(() => { ... }, [options]);  // infinite loop if options = {}
  // Fix: useMemo(() => options, [dep1, dep2])

  // PITFALL 3: no cleanup for subscriptions
  useEffect(() => {
    const sub = websocket.subscribe(userId, setUser);
    return () => sub.unsubscribe();  // ALWAYS cleanup subscriptions!
  }, [userId]);

  return user ? <Profile user={user} /> : <Loading />;
}

3. Quando você deve usar useMemo e useCallback?

// useMemo — memoize expensive computed value
const filteredUsers = useMemo(
  () => users.filter(u => u.active && u.role === selectedRole),
  [users, selectedRole]  // recompute only when these change
);

// useCallback — memoize function reference
const handleDelete = useCallback(
  (userId: number) => {
    setUsers(prev => prev.filter(u => u.id !== userId));
  },
  []  // no deps — stable reference
);

// Use useMemo when:
// - Expensive computation (sorting, filtering large arrays)
// - Object/array passed to children with React.memo
// - Dependency for other hooks

// Use useCallback when:
// - Passing to child component wrapped in React.memo
// - As dependency in useEffect to prevent re-runs

// DON'T overuse — memoization has overhead!
// Bad: const value = useMemo(() => a + b, [a, b]);  // trivial, skip it

4. O que é React.memo e quando usá-lo?

// React.memo — prevent re-render if props haven't changed
const ExpensiveList = React.memo(function ExpensiveList({ items, onItemClick }: Props) {
  console.log('ExpensiveList rendered');
  return (
    <ul>
      {items.map(item => (
        <li key={item.id} onClick={() => onItemClick(item.id)}>
          {item.name}
        </li>
      ))}
    </ul>
  );
});

// Parent using it correctly
function Parent() {
  const [count, setCount] = useState(0);
  const [items] = useState(bigItemList);

  // useCallback ensures stable reference (required for memo to work)
  const handleClick = useCallback((id: number) => {
    console.log('clicked', id);
  }, []);

  return (
    <div>
      <button onClick={() => setCount(c => c + 1)}>Count: {count}</button>
      {/* ExpensiveList won't re-render when count changes */}
      <ExpensiveList items={items} onItemClick={handleClick} />
    </div>
  );
}

Gestão Estadual

5. Quando você deve usar Redux vs Zustand vs Context API?

Ferramenta Usar quando Evite quando
API de contexto Tema, localidade, estado de autenticação (atualizações pouco frequentes) Atualizações frequentes (causa novas renderizações)
Zustand A maioria dos aplicativos que precisam de estado global Necessidades de fornecimento de eventos muito complexos
Kit de ferramentas Redux Equipes grandes, estado complexo, depuração de viagem no tempo Aplicativos simples (exagero)
Consulta TanStack Estado do servidor (sempre) Não para o estado da IU

Reaja 19 perguntas

6. O que são componentes de servidor e como eles diferem dos componentes de cliente?

// Server Component (default in Next.js App Router)
// - Runs only on server, never on client
// - Can access databases, file system directly
// - Zero JS sent to client (except HTML)
// - Cannot use state, effects, event handlers

async function ProductList() {  // no 'use client'
  const products = await db.products.findMany();  // direct DB access!
  return (
    <ul>
      {products.map(p => <ProductCard key={p.id} product={p} />)}
    </ul>
  );
}

// Client Component (must add 'use client')
// - Runs on both server (initial HTML) and client (hydration)
// - Can use useState, useEffect, event handlers
// - Receives props from Server Components

'use client';
function AddToCart({ productId }: { productId: number }) {
  const [added, setAdded] = useState(false);

  return (
    <button onClick={() => {
      addToCart(productId);
      setAdded(true);
    }}>
      {added ? 'Added!' : 'Add to Cart'}
    </button>
  );
}

7. Quais são os novos recursos do React 19?

  • Ações do servidor— funções assíncronas executadas no servidor, que podem ser chamadas pelo cliente
  • usar() gancho— lê promessas e contexto na renderização (substitui alguns padrões useEffect)
  • Ações de formulário— manipulação de formulário nativo com funções de servidor
  • Atualizações otimistas— useOptimistic() para feedback imediato da UI
  • Metadados do documento— título, meta tags em componentes diretamente
  • Carregamento de ativos— Integração suspensa para imagens e CSS

8. Como você lida com erros no React?

// Error Boundary (class component, required for now)
class ErrorBoundary extends React.Component<
  { fallback: React.ReactNode; children: React.ReactNode },
  { hasError: boolean }
> {
  state = { hasError: false };

  static getDerivedStateFromError() {
    return { hasError: true };
  }

  componentDidCatch(error: Error, info: React.ErrorInfo) {
    logErrorToService(error, info);
  }

  render() {
    if (this.state.hasError) return this.props.fallback;
    return this.props.children;
  }
}

// Usage
<ErrorBoundary fallback={<ErrorPage />}>
  <UserProfile />
</ErrorBoundary>

// React 19: useErrorBoundary hook coming (use 'react-error-boundary' lib now)

Preparação para entrevista React: entenda profundamente os ganchos (especialmente as dependências useEffect), saiba quando otimizar (React.memo + useCallback/useMemo), explique a divisão do componente servidor/cliente e conheça as opções atuais de gerenciamento de estado. Crie alguns aplicativos de produção para compreender esses conceitos experimentalmente, não apenas teoricamente.

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇬🇧 English🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা