Front End

31 mar, 2026

8 conceitos do React moderno que todo sênior precisa dominar

Publicidade

Se você começou com React há alguns anos, provavelmente aprendeu um modelo relativamente simples: componentes, estado, props e ciclo de vida. Só que esse modelo não explica mais o que está acontecendo hoje. O React evoluiu, ficou mais poderoso… e também mais complexo.

Features como Server Components, Suspense e concorrência mudaram completamente a forma como a renderização funciona. O problema é que muita gente continua programando com o modelo mental antigo — e é exatamente aí que surgem bugs difíceis, problemas de performance e decisões erradas de arquitetura.

Este artigo é um guia direto ao ponto com 8 conceitos essenciais do React moderno que você precisa entender para não ficar para trás — e, principalmente, para não criar problemas invisíveis no seu código.

1. Render não é Commit (e essa diferença muda tudo)

Esse é, talvez, o conceito mais importante e menos entendido.

No React moderno, renderizar não significa que algo apareceu na tela.

👉 Render = cálculo do que deve mudar
👉 Commit = aplicação dessas mudanças no DOM

O React pode renderizar várias vezes… e não aplicar nenhuma delas.

Exemplo prático

function Example() {
  console.log('renderizou');

  return <div>Hello</div>;
}

Você pode ver vários logs no console…

👉 sem múltiplas atualizações visuais

Por que isso importa?

Porque qualquer efeito colateral no render pode ser executado várias vezes sem necessidade, gerando bugs difíceis de rastrear.

Anti-pattern

function Example() {
  // ❌ efeito colateral no render
  fetch('/api/data');

  return <div>...</div>;
}

Correto

function Example() {
  useEffect(() => {
    fetch('/api/data');
  }, []);

  return <div>...</div>;
}

2. Concurrent Rendering: o React agora decide prioridades

No React moderno, especialmente a partir do React 18, o render não é mais bloqueante. Isso significa que o React pode pausar, interromper e priorizar atualizações com base na experiência do usuário.

O impacto real

  • interações ficam mais rápidas
  • renders pesados podem ser interrompidos
  • UI não trava facilmente

Exemplo com startTransition

import { useState, startTransition } from 'react';

function Search() {
  const [input, setInput] = useState('');
  const [results, setResults] = useState([]);

  function handleChange(e) {
    const value = e.target.value;
    setInput(value);

    startTransition(() => {
      // atualização não urgente
      setResults(expensiveSearch(value));
    });
  }

  return (
    <>
      <input value={input} onChange={handleChange} />
      <Results list={results} />
    </>
  );
}

O que acontece aqui

  • input responde imediatamente
  • busca pesada é tratada como baixa prioridade

👉 melhora perceptível na UX

3. Suspense não é só loading (é controle de fluxo)

Muita gente acha que Suspense serve apenas para mostrar um “loading”.

Mas ele é muito mais do que isso.

👉 Suspense controla quando uma parte da UI está pronta para ser exibida

Exemplo com Suspense

import { Suspense } from 'react';

function Page() {
  return (
    <div>
      <h1>Dashboard</h1>

      <Suspense fallback={<p>Carregando dados...</p>}>
        <UserData />
      </Suspense>
    </div>
  );
}

O ganho aqui

  • você define fronteiras de carregamento
  • evita bloqueio da UI inteira
  • melhora percepção de performance

4. Server Components: lógica fora do client

Server Components mudam uma premissa básica:

👉 nem tudo precisa rodar no navegador

Exemplo com Next.js

// app/page.tsx
export default async function Page() {
  const data = await fetch('https://api.com/data').then(res => res.json());

  return (
    <ul>
      {data.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

O que muda aqui

  • fetch acontece no servidor
  • menos JS enviado ao cliente
  • melhor performance

👉 isso reduz bundle e melhora LCP

5. Client vs Server Components: separação estratégica

Com Server Components, você precisa decidir:

👉 o que roda no servidor
👉 o que roda no cliente

Exemplo de separação

// Server Component
import ClientButton from './ClientButton';

export default function Page() {
  return (
    <div>
      <h1>Produtos</h1>
      <ClientButton />
    </div>
  );
}
// Client Component
'use client';

export default function ClientButton() {
  return <button>Comprar</button>;
}

Regra prática

  • lógica pesada → servidor
  • interação → cliente

6. Efeitos são mais perigosos do que parecem

Com concurrent rendering, efeitos podem rodar mais vezes do que você espera.

Exemplo clássico de problema

useEffect(() => {
  console.log('executou');
}, []);

Em desenvolvimento (Strict Mode), isso roda duas vezes.

Por quê?

👉 o React simula cenários para detectar efeitos inseguros

Implicação real

Se seu efeito:

  • faz requisição
  • altera estado externo

Você pode ter comportamento inesperado.

Solução

  • tornar efeitos idempotentes
  • evitar lógica crítica em useEffect

7. Memoização não é solução universal

useMemo e useCallback são frequentemente usados de forma errada.

Anti-pattern

const memoized = useMemo(() => expensiveCalc(data), [data]);

Sem medir, isso pode:

  • aumentar complexidade
  • piorar performance

Regra sênior

👉 só use memo quando há problema comprovado

8. O novo modelo mental do React

Se você continuar pensando em React como render síncrono, execução linear e efeitos previsíveis, você vai cometer erros.

O modelo correto

React moderno é: assíncrono, concorrente, baseado em prioridade e orientado à experiência do usuário.

O erro mais comum hoje, não é usar a feature errada. É usar a feature certa com o modelo mental antigo.

Conclusão: React ficou mais poderoso e, também, mais perigoso

As novas capacidades do React permitem construir aplicações mais rápidas, mais escaláveis e mais eficientes. Mas, ao mesmo tempo, exigem mais cuidado, mais entendimento e mais intenção nas decisões.

Se você domina esses conceitos: evita bugs invisíveis, melhora performance real e toma decisões arquiteturais melhores, você entende o modelo mental. E no React moderno… o modelo mental é tudo.