Tipos de componente React
react
Se você está começando a explorar o universo do desenvolvimento front-end com React, provavelmente já ouviu falar sobre "componentes". Mas o que exatamente são eles, quais os principais e como escolher o melhor para o seu projeto? Neste artigo, vamos desvendar o que são componentes no React, mostrando os principais tipos e suas características para ajudar você a dominar esse conceito essencial.

O que são componentes React?

Os componentes são blocos de construção no React. Eles permitem que você divida a interface do usuário em pequenas partes reutilizáveis e isoladas, que podem ser combinadas para formar uma aplicação completa. Cada componente React tem a sua própria lógica e estilo, tornando a manutenção e o desenvolvimento de interfaces mais fáceis e organizados.
📽️
Se você quer entender ainda mais sobre o conceito de componentes e propriedades no React, confira este vídeo incrível:
Video preview

Por que os componentes são importantes no React?

Com o crescimento das aplicações front-end, organizar o código de forma eficiente é crucial. Os componentes possibilitam essa organização ao isolar funcionalidades, facilitando a reutilização e modificação. Essa abordagem modular também aumenta a performance, pois cada componente é renderizado independentemente, o que é essencial para grandes aplicações.

Principais tipos de componentes React

No React, você vai encontrar alguns tipos principais de componentes. Conhecê-los vai ajudar você a fazer escolhas melhores para cada situação:
  1. Componentes funcionais
  1. Componentes de classe
  1. Componentes de ordem superior (higher-order components, HOCs)
  1. Componentes render props
  1. Componentes memoizados
  1. Componentes assíncronos (server components)
Vamos entender as diferenças entre eles, suas características e quando utilizá-los. Bora codar?

1. Componentes funcionais

Os componentes funcionais são funções JavaScript que retornam JSX, uma sintaxe semelhante a HTML. Com a introdução dos hooks no React 16.8, os componentes funcionais passaram a ter funcionalidades que antes eram exclusivas dos componentes de classe, como o gerenciamento de estado e ciclo de vida.

Como criar um componente funcional

Aqui está um exemplo básico de um componente funcional:
function OlaMundo() { return <h1>Olá, Mundo!</h1>; } export default OlaMundo;

Hooks nos componentes funcionais

Os hooks, como useState e useEffect, permitem que você adicione estado e efeitos colaterais aos componentes funcionais. Veja um exemplo de uso do useState:
import React, { useState } from 'react'; function Contador() { const [contador, setContador] = useState(0); return ( <div> <p>Você clicou {contador} vezes</p> <button onClick={() => setContador(contador + 1)}>Clique aqui</button> </div> ); } export default Contador;

Vantagens dos componentes funcionais

  • Sintaxe simples: a escrita de um componente funcional é mais direta e enxuta.
  • Reutilização: eles permitem a reutilização de lógica com os hooks, especialmente o useEffect e useReducer.
  • Performance: geralmente são mais leves e rápidos, principalmente para renderizações simples.

Quando usar componentes funcionais?

Prefira componentes funcionais quando você precisa de um código mais limpo, conciso e quando as funcionalidades do componente se beneficiam dos hooks.
📄
Curioso para saber as últimas novidades? Confira o artigo React 19: Utilizando o Novo Hook e veja como explorar o novo Hook para aprimorar suas aplicações!

2. Componentes de classe

Os componentes de classe são criados com classes JavaScript que estendem React.Component. Antes dos hooks, essa era a única maneira de usar o estado e o ciclo de vida nos componentes React.

Estrutura básica de um componente de classe

Aqui está um exemplo simples de um componente de classe:
import React, { Component } from 'react'; class OlaMundo extends Component { render() { return <h1>Olá, Mundo!</h1>; } } export default OlaMundo;

Ciclo de vida dos componentes de classe

Os componentes de classe possuem métodos de ciclo de vida, como componentDidMount e componentDidUpdate, que permitem controlar o comportamento do componente em diferentes momentos de sua existência.
import React, { Component } from 'react'; class Contador extends Component { constructor(props) { super(props); this.state = { contador: 0 }; } componentDidMount() { console.log('Componente montado'); } componentDidUpdate() { console.log('Componente atualizado'); } render() { return ( <div> <p>Você clicou {this.state.contador} vezes</p> <button onClick={() => this.setState({ contador: this.state.contador + 1 })}> Clique aqui </button> </div> ); } } export default Contador;

Quando usar componentes de classe?

Os componentes de classe podem ser necessários em projetos legados ou em bibliotecas que ainda dependem deste tipo de estrutura. Entretanto, o React recomenda componentes funcionais para novos projetos, pois são mais modernos e simplificam o código.

3. Componentes de ordem superior (higher-order components)

Os higher-order components (HOCs) são uma técnica avançada do React para reutilizar lógica em componentes. Um HOC é uma função que recebe um componente como argumento e retorna um novo componente com funcionalidades adicionais.
import React from 'react'; const withExtraInfo = (Component) => (props) => { return ( <div> <Component {...props} /> <p>Informação extra</p> </div> ); }; const MeuComponente = () => <h1>Componente Original</h1>; export default withExtraInfo(MeuComponente);
HOCs são úteis quando você precisa adicionar funcionalidades a vários componentes de forma centralizada, mas são menos comuns com a introdução dos hooks.

Evolução com hooks personalizados

Com a introdução dos hooks personalizados, muitos padrões que antes eram implementados com HOCs podem ser substituídos, simplificando o código:
  • Menos aninhamento: elimina a necessidade de envolver componentes dentro de outros.
  • Maior legibilidade: a lógica é extraída para funções separadas, tornando o componente principal mais limpo.
Exemplo com Hook personalizado:
import React, { useState, useEffect } from 'react'; // Hook personalizado que adiciona informação extra function useExtraInfo() { const [info, setInfo] = useState(''); useEffect(() => { setInfo('Informação extra'); }, []); return info; } const MeuComponente = () => { const info = useExtraInfo(); return ( <div> <h1>Componente Original</h1> <p>{info}</p> </div> ); }; export default MeuComponente;

4. Componentes render props

Os componentes render props permitem que um componente compartilhe código reutilizável entre múltiplos componentes usando uma função como prop para definir o que será renderizado.
import React from 'react'; class ComponenteRenderProp extends React.Component { render() { return <div>{this.props.render("Olá com render props!")}</div>; } } export default () => ( <ComponenteRenderProp render={(mensagem) => <h1>{mensagem}</h1>} /> );
Este padrão é útil para compartilhar lógica de renderização de forma flexível, porém foi substituído em muitos casos pelos hooks.

5. Componentes memoizados

Com React.memo, é possível criar componentes memoizados que evitam renderizações desnecessárias ao comparar as propriedades recebidas. Se as props não mudarem, o componente não será renderizado novamente, o que pode melhorar a performance em casos específicos.
import React from 'react'; const ComponenteMemoizado = React.memo(({ valor }) => { console.log("Renderizado apenas se 'valor' mudar"); return <p>{valor}</p>; }); export default ComponenteMemoizado;

Quando usar componentes memoizados?

A memoização é mais eficaz em componentes que:
  • Realizam operações pesadas: componentes que fazem cálculos complexos ou renderizam listas extensas.
  • São puros: componentes que retornam o mesmo resultado dadas as mesmas props e não dependem de estado ou efeitos colaterais internos.
No entanto, é importante usar React.memo com discernimento:
  • Sobrecarga desnecessária: em componentes leves, a comparação das props pode consumir mais recursos do que a própria renderização.
  • Complexidade adicional: pode tornar o código mais difícil de ler e manter se usado indiscriminadamente.

Vantagens e considerações

  • Vantagens:
    • Otimiza a performance evitando renderizações desnecessárias.
    • Fácil de implementar em componentes funcionais.
  • Considerações:
    • Use após identificar problemas reais de performance.
    • Avalie se a complexidade adicionada justifica os benefícios.
Utilize React.memo quando houver um ganho significativo de performance. Sempre teste e monitore o comportamento do seu componente para garantir que a memoização esteja trazendo os benefícios esperados.

6. Componentes assíncronos (server components)

Os server components são um tipo especial de componente React que é processado no servidor e enviado como HTML ao cliente. Eles não podem usar hooks ou JavaScript do lado do cliente, mas são muito úteis para otimizar o carregamento de dados em aplicações complexas.
const ReactServerComponent = async () => { const response = await fetch('https://api.exemplo.com/data'); const dados = await response.json(); return ( <ul> {dados.map((item) => ( <li key={item.id}>{item.nome}</li> ))} </ul> ); }; export default ReactServerComponent;
Server components são uma inovação que, juntamente com frameworks como o Next.js, permite otimizar aplicações React ao reduzir a quantidade de JavaScript enviado para o cliente.

Comparação: principais tipos de componentes React

notion image

Conclusão

Dominar os diferentes tipos de componentes em React é essencial para criar interfaces de usuário dinâmicas e organizadas. Os componentes funcionais são uma ótima escolha para a maioria dos projetos modernos, especialmente com a introdução dos hooks. Já os componentes de classe são úteis para projetos legados ou quando é necessário suporte para métodos de ciclo de vida específicos.
Além disso, técnicas avançadas como HOCs, render props e memoização se tornam valiosas em projetos complexos, enquanto os server components representam uma inovação poderosa para otimizar o carregamento de dados e melhorar o SEO.

Quer avançar mais? Conheça a formação em React da Rocketseat!

Para você que deseja aprender e dominar uma das tecnologias mais populares no mercado, a Formação em React da Rocketseat é o caminho ideal. Você irá aprender React do zero ao avançado, desenvolvendo habilidades que vão desde a criação de interfaces reativas até a construção de aplicações complexas, evoluindo sua carreira como front-end.
Destaques da formação em React:
  • Intermediário - Pensada para quem já tem noções básicas de desenvolvimento.
  • +64 horas de conteúdo - Aulas gravadas para você assistir quando e onde quiser.
  • Certificado reconhecido pelo mercado - Valide suas habilidades com um certificado final.
  • +15 projetos profissionais - Inclua projetos reais no seu portfólio para se destacar.
  • Acompanhamento personalizado - Tutoria e suporte para suas dúvidas ao longo da jornada.
  • +437 aulas e 113 quizzes e desafios - Pratique e aplique o que aprendeu.
Na formação, você aprende novas tecnologias na prática, desenvolvendo projetos e cases reais que simulam os desafios do dia a dia de um desenvolvedor front-end. Isso proporciona experiência e confiança para construir um portfólio de brilhar os olhos e atrair as melhores oportunidades no mercado.
Tecnologias e ferramentas que você vai aprender:
  • JavaScript
  • ReactJS
  • Node.js
  • Next.js
  • TypeScript
  • Vite
  • TailwindCSS
Sobre o Instrutor - Diego Fernandes: Diego Fernandes é especialista em JavaScript, com mais de 11 anos de experiência, focado em React e Node.js. Apaixonado por programação e aprendizado contínuo, ele está sempre à frente das últimas tecnologias. Como Co-fundador e CTO da Rocketseat, Diego já formou mais de 40 mil devs, impulsionando suas carreiras para o próximo nível.

Aprenda programação do zero e DE GRAÇA

No Discover você vai descomplicar a programação, aprender a criar seu primeiro site com a mão na massa e iniciar sua transição de carreira.

COMECE A ESTUDAR AGORA