🚀 Capítulo 10: Context API - Rede de Comunicação
🎯 Objetivo da Aula
Ao final desta aula, você entenderá o problema do “Prop Drilling” (passar propriedades por muitos níveis) e saberá como usar a Context API para compartilhar um estado global entre vários componentes sem precisar passar props manualmente.
🏢 O Cenário Prático (Seu Desafio)
O alarme de invasão da Base Rebelde precisa ser ouvido por todos os componentes da nave! No entanto, o botão do alarme fica na cabine principal. Seu desafio é usar a Context API para fazer com que o status do alarme chegue a todos os componentes filhos instantaneamente!
🧠 Fundamentos: A Teoria Traduzida
Até agora, para passar um dado do Pai para o Filho do Filho, precisávamos passar a prop pelo Filho do meio (que nem usava o dado). Isso se chama Prop Drilling e é muito chato de fazer em projetos grandes.
A Context API funciona como uma rede de rádio da base:
createContext(): Cria a frequência de rádio (o contexto).Provider: É o transmissor que envia o sinal para todos que estão dentro dele.useContext(): É o radinho que o componente Filho usa para escutar a mensagem.
📖 Exemplo Guiado: Alarme da Base
Vamos criar o contexto do alarme.
🛠️ Passo a Passo (Criando o Contexto)
- Crie um arquivo chamado
AlarmeContext.jsxna pastasrc:
import { createContext, useState } from 'react';
// 1. Criamos o contexto
export const AlarmeContext = createContext();
// 2. Criamos o Provider (Transmissor)
export function AlarmeProvider({ children }) {
const [alarmeAtivo, setAlarmeAtivo] = useState(false);
return (
<AlarmeContext.Provider value={{ alarmeAtivo, setAlarmeAtivo }}>
{children}
</AlarmeContext.Provider>
);
}🛠️ Passo a Passo (Envolvendo a Aplicação)
Abra o App.jsx e envolva os componentes com o Provider:
import { AlarmeProvider } from './AlarmeContext';
import Cabine from './Cabine';
import Motor from './Motor';
function App() {
return (
<AlarmeProvider>
<div>
<h1>🚀 Sistemas da Nave</h1>
<Cabine />
<Motor />
</div>
</AlarmeProvider>
)
}
export default App;🛠️ Passo a Passo (Consumindo o Contexto)
Crie o componente Motor.jsx que precisa saber do alarme:
import { useContext } from 'react';
import { AlarmeContext } from './AlarmeContext';
function Motor() {
// Usamos o radinho para ouvir a frequência do alarme
const { alarmeAtivo } = useContext(AlarmeContext);
return (
<div style={{ background: alarmeAtivo ? 'red' : 'green', color: 'white' }}>
<h3>Status do Motor</h3>
<p>{alarmeAtivo ? '⚠️ Potência Máxima! Alarme Ativo!' : 'Operação Normal'}</p>
</div>
)
}
export default Motor;🕹️ Como Executar e Testar no VS Code
- Crie também o componente
Cabine.jsxcom um botão que usasetAlarmeAtivo(!alarmeAtivo). - Salve tudo e clique no botão na cabine. Você verá o componente Motor mudar de cor mesmo sem receber nenhuma prop direta do App!
🛠️ Prática Obrigatória 1
Crie o componente Cabine.jsx que consome o AlarmeContext e tem um botão escrito “Disparar Alarme” que altera o estado de alarmeAtivo.
🛠️ Prática Obrigatória 2
Adicione um novo valor no contexto chamado nivelAlerta (iniciando em “Baixo”). Crie um botão na cabine para mudar o nível para “Alto”.
🔑 Gabarito de Código/Fórmulas
Prática 1:
No Cabine.jsx:
import { useContext } from 'react';
import { AlarmeContext } from './AlarmeContext';
function Cabine() {
const { alarmeAtivo, setAlarmeAtivo } = useContext(AlarmeContext);
return (
<div>
<h3>Cabine de Comando</h3>
<button onClick={() => setAlarmeAtivo(!alarmeAtivo)}>
{alarmeAtivo ? 'Desligar Alarme' : 'Disparar Alarme'}
</button>
</div>
)
}