04 - Componentes Básicos¶
Introdução aos Componentes¶
Componentes são os blocos de construção fundamentais do React. Eles permitem dividir a interface do usuário em partes independentes e reutilizáveis, facilitando a manutenção e organização do código.
O que são Componentes?¶
- Definição: Funções JavaScript que retornam JSX
- Reutilização: Podem ser usados múltiplas vezes
- Isolamento: Cada componente tem sua própria lógica e estilo
- Composição: Componentes podem usar outros componentes
Vantagens dos Componentes¶
- Reutilização de código: Escreva uma vez, use várias vezes
- Manutenção: Mais fácil de encontrar e corrigir problemas
- Organização: Código dividido em partes lógicas
- Colaboração: Diferentes desenvolvedores podem trabalhar em componentes diferentes
Anatomia de um Componente¶
// Componente simples
function MinhasMensagem() {
return <h1>Olá, mundo!</h1>;
}
// Componente com múltiplos elementos
function CartaoUsuario() {
return (
<div className="cartao">
<h2>João Silva</h2>
<p>Desenvolvedor React</p>
<button>Ver Perfil</button>
</div>
);
}
Regras Importantes¶
- Nome com letra maiúscula:
MinhaComponente(nãominhaComponente) - Deve retornar JSX: Sempre retorne algo renderizável
- Um elemento raiz: Use
<div>ou<>para envolver múltiplos elementos - Export/Import: Use
export defaultpara exportar
Evoluindo o Projeto: Componentizando a Lista de Países¶
Vamos pegar nosso projeto do módulo anterior e dividi-lo em componentes reutilizáveis.
Versão Anterior (Monolítica):¶
// App.jsx - Tudo em um componente
function App() {
return (
<div className="app">
<h1>🌍 Lista de Países</h1>
<div className="country-grid">
<div className="country-card">
<h3>🇧🇷 Brasil</h3>
<p>Capital: Brasília</p>
</div>
<div className="country-card">
<h3>🇦🇷 Argentina</h3>
<p>Capital: Buenos Aires</p>
</div>
<div className="country-card">
<h3>🇨🇱 Chile</h3>
<p>Capital: Santiago</p>
</div>
</div>
</div>
);
}
Nova Versão (Componentizada):¶
1. Criando o componente CountryCard:
// src/components/CountryCard.jsx
function CountryCard() {
return (
<div className="country-card">
<h3>🇧🇷 Brasil</h3>
<p>Capital: Brasília</p>
</div>
);
}
export default CountryCard;
2. Criando o componente Header:
// src/components/Header.jsx
function Header() {
return (
<header className="app-header">
<h1>🌍 Lista de Países</h1>
<p>Explore países ao redor do mundo</p>
</header>
);
}
export default Header;
3. Criando o componente CountryGrid:
// src/components/CountryGrid.jsx
import CountryCard from './CountryCard';
function CountryGrid() {
return (
<div className="country-grid">
<CountryCard />
<CountryCard />
<CountryCard />
</div>
);
}
export default CountryGrid;
4. App.jsx simplificado:
// src/App.jsx
import Header from './components/Header';
import CountryGrid from './components/CountryGrid';
import './App.css';
function App() {
return (
<div className="app">
<Header />
<CountryGrid />
</div>
);
}
export default App;
Estrutura de Pastas Organizada¶
src/
├── components/
│ ├── Header.jsx
│ ├── CountryCard.jsx
│ └── CountryGrid.jsx
├── App.jsx
├── App.css
└── main.jsx
CSS Atualizado¶
/* App.css */
.app {
max-width: 900px;
margin: 0 auto;
padding: 20px;
font-family: 'Segoe UI', Arial, sans-serif;
}
.app-header {
text-align: center;
margin-bottom: 30px;
padding: 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 10px;
}
.app-header h1 {
margin: 0 0 10px 0;
font-size: 2.5em;
}
.app-header p {
margin: 0;
opacity: 0.9;
}
.country-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 20px;
}
.country-card {
border: 1px solid #e1e8ed;
border-radius: 12px;
padding: 20px;
background: white;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.country-card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 16px rgba(0,0,0,0.15);
}
.country-card h3 {
margin: 0 0 10px 0;
color: #333;
font-size: 1.3em;
}
.country-card p {
margin: 5px 0;
color: #666;
}
Conceitos Importantes de Componentes¶
1. Reutilização¶
- O mesmo componente pode ser usado várias vezes
- Cada instância é independente
- Facilita manutenção do código
2. Responsabilidade Única¶
- Cada componente deve ter uma função específica
- Header → cabeçalho da aplicação
- CountryCard → exibir informações de um país
- CountryGrid → organizar múltiplos países
3. Hierarquia de Componentes¶
4. Import/Export¶
// Exportar (no final do arquivo)
export default CountryCard;
// Importar (no início do arquivo)
import CountryCard from './CountryCard';
Exercícios Práticos¶
1. Criar novos componentes:
- Crie um componente Footer com informações do site
- Adicione um componente Navigation com links fictícios
2. Modificar componentes existentes:
- Adicione mais informações no CountryCard (população, idioma)
- Personalize as cores e estilos
3. Experimentar com estrutura:
- Mova os componentes para subpastas organizadas
- Crie variações do CountryCard (pequeno, médio, grande)
Próximos Passos¶
No próximo módulo aprenderemos sobre Props, que permitirão passar dados para os componentes, tornando-os verdadeiramente dinâmicos e reutilizáveis. Transformaremos nossos cartões de países estáticos em componentes que podem exibir informações diferentes!