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.
📋 Table of Contents
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:
- React cria uma nova árvore DOM virtual
- Algoritmo de comparação compara DOM virtual novo e anterior
- Apenas nós alterados são atualizados no DOM real
- 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.
🔗 Share this article
✍️ Leave a Comment