Claude Code

Claude Code + React: Guia Completo para Devs Frontend

minhaskills.io Claude Code + React: Guia Completo para Devs Frontend Claude Code
minhaskills.io 2 abr 2026 13 min de leitura

Se voce trabalha com React, ja sabe: criar componentes, escrever testes, refatorar codigo legado e otimizar performance consomem horas do seu dia. O Claude Code transforma essas tarefas. Ele le seu projeto inteiro, entende seus padroes e gera codigo que se encaixa perfeitamente na sua codebase.

Nao estamos falando de snippets genericos copiados de documentacao. O Claude Code analisa a estrutura do seu projeto -- se usa TypeScript, styled-components, Zustand, React Query -- e gera codigo que segue exatamente o mesmo padrao. Ele entende contexto.

Neste guia, voce vai ver exemplos reais de como usar Claude Code para cada etapa do desenvolvimento React: criar componentes, extrair hooks, escrever testes, migrar class components e otimizar renders. Tudo com comandos que voce pode executar hoje.

1. Por que usar Claude Code com React

React e um framework que exige muito codigo boilerplate. Um componente simples com TypeScript, props tipadas, testes e estilos pode facilmente ter 4 arquivos e 200+ linhas. Multiplique por dezenas de componentes e voce tem centenas de horas de trabalho repetitivo.

O Claude Code resolve isso porque ele opera diretamente no seu codebase. Diferente de chatbots que geram codigo isolado, o Claude Code:

Diferencial real: o Claude Code nao e um autocomplete. Ele e um desenvolvedor assistente que entende o contexto completo do seu projeto e executa tarefas end-to-end. Peca "crie um componente de modal reutilizavel" e ele analisa como seus outros componentes sao estruturados antes de escrever uma unica linha.

2. Configurando o ambiente

Para usar Claude Code com React, voce precisa do Claude Code instalado e um projeto React. O setup e simples:

Terminal
# Instalar Claude Code (se ainda nao tem)
$ npm install -g @anthropic-ai/claude-code

# Navegar para o projeto React
$ cd meu-projeto-react

# Iniciar Claude Code
$ claude

# Claude Code indexa automaticamente a estrutura do projeto
# Ele le package.json, tsconfig, eslint, jest config, etc.

Ao iniciar, o Claude Code identifica automaticamente que e um projeto React e ajusta seu comportamento. Ele reconhece:

CLAUDE.md para projetos React

Para resultados ainda melhores, crie um arquivo CLAUDE.md na raiz do projeto com as convencoes da equipe:

# CLAUDE.md

## Padroes de componentes
- Usar functional components com TypeScript
- Props tipadas com interface (nao type)
- Exportar componente como default
- Um componente por arquivo
- Colocar em src/components/[NomeComponente]/

## Estrutura de cada componente
- index.tsx (componente principal)
- types.ts (interfaces de props)
- styles.module.css (estilos)
- [NomeComponente].test.tsx (testes)

## Testes
- Usar React Testing Library
- Testar comportamento, nao implementacao
- Minimo: render sem crash + interacoes principais

## Estado
- Estado local: useState/useReducer
- Estado global: Zustand
- Estado do servidor: React Query

Com esse arquivo, o Claude Code segue suas convencoes em 100% dos casos. Sem ele, ele infere os padroes analisando o codigo existente -- o que funciona bem, mas o CLAUDE.md elimina ambiguidades.

3. Criando componentes com Claude Code

Criar componentes e onde o Claude Code mais brilha. Voce descreve o que precisa, e ele gera o componente completo com tipos, estilos e testes.

Exemplo: componente de card de produto

Claude Code
> crie um componente ProductCard que receba nome, preco, imagem e
descricao. Deve ter botao "adicionar ao carrinho" que chama uma
callback onAddToCart. Siga os padroes do projeto.

O Claude Code analisa o projeto e gera:

// src/components/ProductCard/types.ts
export interface ProductCardProps {
  name: string;
  price: number;
  image: string;
  description: string;
  onAddToCart: (productName: string) => void;
}

// src/components/ProductCard/index.tsx
import { memo } from 'react';
import type { ProductCardProps } from './types';
import styles from './styles.module.css';

function ProductCard({ name, price, image, description, onAddToCart }: ProductCardProps) {
  return (
    <article className={styles.card}>
      <img
        src={image}
        alt={name}
        className={styles.image}
        loading="lazy"
      />
      <div className={styles.content}>
        <h3 className={styles.name}>{name}</h3>
        <p className={styles.description}>{description}</p>
        <div className={styles.footer}>
          <span className={styles.price}>
            {new Intl.NumberFormat('pt-BR', {
              style: 'currency',
              currency: 'BRL'
            }).format(price)}
          </span>
          <button
            className={styles.button}
            onClick={() => onAddToCart(name)}
            type="button"
          >
            Adicionar ao carrinho
          </button>
        </div>
      </div>
    </article>
  );
}

export default memo(ProductCard);

Note que ele usou memo automaticamente (porque e um componente que recebe props e pode se beneficiar de memoizacao), loading="lazy" na imagem, formatacao de moeda brasileira com Intl.NumberFormat e semantica HTML correta com <article>.

Componentes complexos

O Claude Code tambem gera componentes mais complexos. Formularios com validacao, tabelas com ordenacao e paginacao, modais com portal, wizards multi-step -- tudo seguindo os padroes do seu projeto:

Claude Code
> crie um componente DataTable generico com TypeScript generics
que suporte ordenacao por coluna, paginacao e busca. Deve aceitar
qualquer tipo de dado via generics.

Ele gera o componente com generics (DataTable<T>), hooks internos para estado de ordenacao e paginacao, e tipagem completa. Se o projeto usa React Query, ele pode integrar com paginacao server-side automaticamente.

4. Hooks customizados na pratica

Hooks customizados sao onde React realmente brilha para reutilizacao de logica. O Claude Code identifica oportunidades de extracao de hooks e cria hooks robustos.

Exemplo: useDebounce

Claude Code
> crie um hook useDebounce que aceite um valor e um delay
e retorne o valor debounced. Com cleanup correto.
// src/hooks/useDebounce.ts
import { useState, useEffect } from 'react';

export function useDebounce<T>(value: T, delay: number = 300): T {
  const [debouncedValue, setDebouncedValue] = useState<T>(value);

  useEffect(() => {
    const timer = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => clearTimeout(timer);
  }, [value, delay]);

  return debouncedValue;
}

Exemplo: useLocalStorage

// src/hooks/useLocalStorage.ts
import { useState, useCallback } from 'react';

export function useLocalStorage<T>(
  key: string,
  initialValue: T
): [T, (value: T | ((prev: T) => T)) => void, () => void] {
  const [storedValue, setStoredValue] = useState<T>(() => {
    try {
      const item = window.localStorage.getItem(key);
      return item ? (JSON.parse(item) as T) : initialValue;
    } catch {
      return initialValue;
    }
  });

  const setValue = useCallback(
    (value: T | ((prev: T) => T)) => {
      setStoredValue((prev) => {
        const valueToStore = value instanceof Function ? value(prev) : value;
        window.localStorage.setItem(key, JSON.stringify(valueToStore));
        return valueToStore;
      });
    },
    [key]
  );

  const removeValue = useCallback(() => {
    window.localStorage.removeItem(key);
    setStoredValue(initialValue);
  }, [key, initialValue]);

  return [storedValue, setValue, removeValue];
}

Extraindo hooks de componentes existentes

Um dos usos mais poderosos e pedir ao Claude Code para analisar componentes existentes e extrair logica reutilizavel:

Claude Code
> analise os componentes em src/components/ e identifique
logica duplicada que pode ser extraida em hooks customizados.
Implemente os hooks e refatore os componentes.

O Claude Code faz uma analise completa: identifica padroes como fetch + loading + error repetidos em multiplos componentes, logica de formulario duplicada, manipulacao de estado similar. Ele cria os hooks e atualiza todos os componentes que usavam a logica duplicada.

5. Testes com Jest e Testing Library

Escrever testes e a tarefa que mais devs pulam -- e a que mais se beneficia do Claude Code. Ele gera testes que seguem as melhores praticas do React Testing Library: testam comportamento do usuario, nao detalhes de implementacao.

Gerando testes para um componente existente

Claude Code
> crie testes para o componente ProductCard. Cubra: render
basico, clique no botao, formatacao de preco, imagem com lazy loading.
// src/components/ProductCard/ProductCard.test.tsx
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import ProductCard from './';

const defaultProps = {
  name: 'Camiseta React',
  price: 79.9,
  image: '/images/camiseta.webp',
  description: 'Camiseta oficial do React',
  onAddToCart: jest.fn(),
};

describe('ProductCard', () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('renderiza nome, descricao e preco formatado', () => {
    render(<ProductCard {...defaultProps} />);

    expect(screen.getByRole('heading', { name: 'Camiseta React' })).toBeInTheDocument();
    expect(screen.getByText('Camiseta oficial do React')).toBeInTheDocument();
    expect(screen.getByText('R$\u00a079,90')).toBeInTheDocument();
  });

  it('renderiza imagem com alt text e lazy loading', () => {
    render(<ProductCard {...defaultProps} />);

    const img = screen.getByRole('img', { name: 'Camiseta React' });
    expect(img).toHaveAttribute('src', '/images/camiseta.webp');
    expect(img).toHaveAttribute('loading', 'lazy');
  });

  it('chama onAddToCart com o nome do produto ao clicar', async () => {
    const user = userEvent.setup();
    render(<ProductCard {...defaultProps} />);

    await user.click(screen.getByRole('button', { name: /adicionar ao carrinho/i }));

    expect(defaultProps.onAddToCart).toHaveBeenCalledTimes(1);
    expect(defaultProps.onAddToCart).toHaveBeenCalledWith('Camiseta React');
  });

  it('formata precos com centavos corretamente', () => {
    render(<ProductCard {...defaultProps} price={1299.99} />);
    expect(screen.getByText('R$\u00a01.299,99')).toBeInTheDocument();
  });
});

Note como os testes usam getByRole e getByText em vez de getByTestId -- seguindo a filosofia do Testing Library de testar como o usuario ve a interface. O Claude Code sabe disso porque entende as melhores praticas da biblioteca.

Testes para hooks customizados

// src/hooks/useDebounce.test.ts
import { renderHook, act } from '@testing-library/react';
import { useDebounce } from './useDebounce';

describe('useDebounce', () => {
  beforeEach(() => {
    jest.useFakeTimers();
  });

  afterEach(() => {
    jest.useRealTimers();
  });

  it('retorna o valor inicial imediatamente', () => {
    const { result } = renderHook(() => useDebounce('hello', 500));
    expect(result.current).toBe('hello');
  });

  it('atualiza o valor apos o delay', () => {
    const { result, rerender } = renderHook(
      ({ value, delay }) => useDebounce(value, delay),
      { initialProps: { value: 'hello', delay: 500 } }
    );

    rerender({ value: 'world', delay: 500 });
    expect(result.current).toBe('hello');

    act(() => { jest.advanceTimersByTime(500); });
    expect(result.current).toBe('world');
  });

  it('cancela o timer anterior quando o valor muda', () => {
    const { result, rerender } = renderHook(
      ({ value }) => useDebounce(value, 500),
      { initialProps: { value: 'a' } }
    );

    rerender({ value: 'ab' });
    act(() => { jest.advanceTimersByTime(300); });

    rerender({ value: 'abc' });
    act(() => { jest.advanceTimersByTime(300); });

    expect(result.current).toBe('a');

    act(() => { jest.advanceTimersByTime(200); });
    expect(result.current).toBe('abc');
  });
});

Cobertura em massa

Para projetos com baixa cobertura de testes, voce pode pedir ao Claude Code para gerar testes para todos os componentes de uma vez:

Claude Code
> analise todos os componentes em src/components/ que nao tem
arquivo de teste. Crie testes para cada um cobrindo render basico
e interacoes principais. Rode npm test para verificar se passam.

Isso ai em cima? Skills fazem automaticamente.

Cada tecnica que voce esta lendo pode ser transformada em skill — um comando que o Claude executa perfeitamente, toda vez. O Mega Bundle tem 748+ skills prontas para marketing, dev, SEO, copy e mais.

Ver Skills Prontas — R$19

6. Refatorando class para functional

Se voce tem componentes legados usando class components, o Claude Code faz a migracao de forma segura -- preservando a logica de negocio e convertendo lifecycle methods para hooks.

Exemplo: class component original

// Antes: class component
class UserProfile extends React.Component {
  constructor(props) {
    super(props);
    this.state = { user: null, loading: true, error: null };
  }

  componentDidMount() {
    this.fetchUser();
  }

  componentDidUpdate(prevProps) {
    if (prevProps.userId !== this.props.userId) {
      this.fetchUser();
    }
  }

  componentWillUnmount() {
    this.abortController?.abort();
  }

  async fetchUser() {
    this.abortController = new AbortController();
    this.setState({ loading: true, error: null });
    try {
      const res = await fetch(`/api/users/${this.props.userId}`, {
        signal: this.abortController.signal
      });
      const user = await res.json();
      this.setState({ user, loading: false });
    } catch (err) {
      if (err.name !== 'AbortError') {
        this.setState({ error: err.message, loading: false });
      }
    }
  }

  render() {
    const { user, loading, error } = this.state;
    if (loading) return <Spinner />;
    if (error) return <ErrorMessage message={error} />;
    return <div>{user.name}</div>;
  }
}
Claude Code
> refatore UserProfile de class component para functional
component com hooks. Mantenha o mesmo comportamento incluindo
abort controller e cleanup.

Resultado: functional component

// Depois: functional component com hooks
import { useState, useEffect } from 'react';

interface UserProfileProps {
  userId: string;
}

interface User {
  name: string;
  email: string;
}

function UserProfile({ userId }: UserProfileProps) {
  const [user, setUser] = useState<User | null>(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  useEffect(() => {
    const abortController = new AbortController();

    async function fetchUser() {
      setLoading(true);
      setError(null);
      try {
        const res = await fetch(`/api/users/${userId}`, {
          signal: abortController.signal,
        });
        const data: User = await res.json();
        setUser(data);
        setLoading(false);
      } catch (err) {
        if (err instanceof Error && err.name !== 'AbortError') {
          setError(err.message);
          setLoading(false);
        }
      }
    }

    fetchUser();

    return () => abortController.abort();
  }, [userId]);

  if (loading) return <Spinner />;
  if (error) return <ErrorMessage message={error} />;

  return <div>{user?.name}</div>;
}

export default UserProfile;

O Claude Code converteu componentDidMount e componentDidUpdate em um unico useEffect com userId na dependency array, manteve o AbortController com cleanup no return do useEffect, e adicionou tipagem TypeScript. O comportamento e identico, o codigo e mais limpo.

Migracao em massa

Claude Code
> encontre todos os class components no projeto e liste-os.
Para cada um, avalie a complexidade da migracao (baixa/media/alta).

O Claude Code faz o inventario, classifica por complexidade e voce pode migrar um por um com seguranca, validando os testes a cada etapa.

7. Otimizacao de performance

Performance em React se resume a evitar renders desnecessarios e reduzir o tamanho do bundle. O Claude Code analisa seu projeto e identifica problemas de performance automaticamente.

Audit de re-renders

Claude Code
> analise os componentes em src/components/ e identifique
problemas de performance: componentes que deveriam usar memo,
callbacks que deveriam usar useCallback, valores computados que
deveriam usar useMemo. Liste os problemas e corrija.

O Claude Code identifica padroes como:

Exemplo: antes e depois

// ANTES: problemas de performance
function ProductList({ products, onSelect }) {
  // filteredProducts recalcula a cada render
  const filteredProducts = products.filter(p => p.active);

  return (
    <div>
      {filteredProducts.map(product => (
        <ProductCard
          key={product.id}
          product={product}
          {/* nova funcao criada a cada render */}
          onSelect={() => onSelect(product.id)}
          {/* novo objeto criado a cada render */}
          style={{ marginBottom: 16 }}
        />
      ))}
    </div>
  );
}

// DEPOIS: otimizado pelo Claude Code
const cardStyle = { marginBottom: 16 };

function ProductList({ products, onSelect }) {
  const filteredProducts = useMemo(
    () => products.filter(p => p.active),
    [products]
  );

  const handleSelect = useCallback(
    (id: string) => onSelect(id),
    [onSelect]
  );

  return (
    <div>
      {filteredProducts.map(product => (
        <ProductCard
          key={product.id}
          product={product}
          onSelect={handleSelect}
          style={cardStyle}
        />
      ))}
    </div>
  );
}

Code splitting e lazy loading

O Claude Code tambem pode analisar o bundle e sugerir code splitting:

Claude Code
> analise as rotas do projeto e identifique quais paginas
deveriam usar React.lazy para code splitting. Implemente o
lazy loading com Suspense e fallback de loading.

8. Acessibilidade automatizada

Acessibilidade e frequentemente negligenciada em projetos React. O Claude Code ajuda auditando e corrigindo problemas de acessibilidade nos seus componentes.

Claude Code
> audite todos os componentes em src/components/ para problemas
de acessibilidade (WCAG 2.1 AA). Verifique: aria labels, roles,
contraste, navegacao por teclado, focus management. Corrija os
problemas encontrados.

O Claude Code verifica e corrige:

Ele pode tambem adicionar testes de acessibilidade automatizados usando jest-axe:

import { axe, toHaveNoViolations } from 'jest-axe';

expect.extend(toHaveNoViolations);

it('nao tem violacoes de acessibilidade', async () => {
  const { container } = render(<ProductCard {...defaultProps} />);
  const results = await axe(container);
  expect(results).toHaveNoViolations();
});

9. Workflows completos de desenvolvimento

O real poder do Claude Code aparece quando voce combina multiplas tarefas em workflows completos. Aqui estao os workflows mais comuns para devs React:

Workflow 1: feature completa

Claude Code
> implemente a feature de wishlist: componente WishlistButton
(toggle favoritar/desfavoritar), hook useWishlist (estado persistido
em localStorage), pagina /wishlist que lista os favoritos. Crie
testes para tudo e rode npm test para verificar.

O Claude Code cria todos os arquivos, implementa a logica, escreve os testes, roda para confirmar que passam e reporta o resultado. Uma feature que levaria horas, entregue em minutos.

Workflow 2: code review automatizado

Claude Code
> revise todos os arquivos modificados no ultimo commit.
Verifique: tipos TypeScript corretos, tratamento de erros,
testes cobrindo as mudancas, problemas de performance,
acessibilidade. Reporte em formato de code review.

Workflow 3: upgrade de dependencias

Claude Code
> verifique se ha breaking changes na atualizacao do React
Query v4 para v5. Analise todos os usos no projeto e faca as
alteracoes necessarias. Rode os testes apos cada mudanca.

O Claude Code le o guia de migracao, identifica todos os pontos do codigo afetados, aplica as mudancas e valida com testes. Migracoes que costumam levar dias viram horas.

Dica de produtividade: crie skills especificas para os workflows que voce mais usa. Uma skill /react-component com suas convencoes garante que cada componente gerado segue exatamente o padrao do projeto, sem precisar explicar tudo toda vez. O pacote de skills dev do minhaskills.io inclui dezenas de skills prontas para React.

OFERTA ESPECIAL — TEMPO LIMITADO

O Maior Pacote de Skills de IA do Mercado

748+ Skills + 12 Bonus Packs + 120.000 Prompts

748+
Skills Profissionais
Marketing, SEO, Copy, Dev, Social
12
Pacotes Bonus GitHub
8.107 skills + 4.076 workflows
100K+
Prompts de IA
ChatGPT, Claude, Gemini, Midjourney
135
Agents Prontos
Automacao, dados, negocio, dev

De R$197

R$19

Pagamento unico • Acesso vitalicio • Atualizacoes gratis

QUERO O MEGA BUNDLE AGORA

Instale em 2 minutos • Funciona com Claude Code, Cursor, ChatGPT • 7 dias de garantia

✓ SEO & GEO (20 skills) ✓ Copywriting (34 skills) ✓ Dev (284 skills) ✓ Social Media (170 skills) ✓ n8n Templates (4.076)

Perguntas frequentes

Sim. O Claude Code le a estrutura do seu projeto, entende o padrao de componentes que voce usa (funcional, com TypeScript, com styled-components, etc.) e cria componentes completos seguindo o mesmo padrao. Ele gera o arquivo do componente, os tipos TypeScript, testes unitarios e ate stories do Storybook se o projeto usar. Basta descrever o que o componente deve fazer.

Sim, e esse e um dos casos de uso mais comuns. Voce pode pedir ao Claude Code para refatorar um class component para functional component com hooks. Ele converte lifecycle methods para useEffect, this.state para useState, e mantem a mesma logica de negocio. Ele tambem identifica oportunidades de extrair custom hooks para reutilizar logica entre componentes.

Sim. O Claude Code gera testes usando Jest e React Testing Library seguindo as melhores praticas: testando comportamento do usuario em vez de detalhes de implementacao, usando queries acessiveis como getByRole e getByText, e cobrindo cenarios de interacao, estados de loading/erro e edge cases. Ele tambem configura mocks para APIs e contextos quando necessario.

Compartilhe este artigo X / Twitter LinkedIn Facebook WhatsApp
PTENES