🚀 Capítulo 16: Portals e Refs
🎯 Objetivo da Aula
Ao final desta aula, você entenderá como usar o Hook useRef para “tocar” diretamente em elementos do HTML (como focar em um campo de texto) e o conceito de Portals para desenhar elementos fora da árvore principal do componente (como janelas modais ou hologramas).
🏢 O Cenário Prático (Seu Desafio)
Você precisa de um Projetor Holográfico que mostre mensagens de alerta flutuando fora do painel principal da nave! Além disso, precisa que o cursor do teclado vá direto para o campo de digitação de coordenadas assim que a tela abrir (foco automático).
🧠 Fundamentos: A Teoria Traduzida
1. O que é o useRef?
No React, nós não usamos document.getElementById(). Para pegar a referência de uma tag HTML e mexer nela diretamente, usamos o useRef.
- Para que serve? Focar em um input, dar play em um vídeo, ou medir o tamanho de uma caixa sem precisar atualizar a tela.
2. O que são Portals?
Normalmente, todo componente que você cria fica dentro da <div> principal do seu aplicativo. Mas e se você quiser criar um aviso que fica por cima de tudo na tela (como um modal)? O Portal permite “teletransportar” o HTML do componente para outro lugar do arquivo index.html.
📖 Exemplo Guiado: Focando no Input com useRef
Vamos fazer o cursor focar no input automaticamente.
🛠️ Passo a Passo
Abra o arquivo src/App.jsx e altere o código:
import { useState, useRef } from 'react';
function App() {
const [coordenadas, setCoordenadas] = useState('');
// 1. Criamos a referência
const inputRef = useRef(null);
function focarNoInput() {
// 3. Acessamos o elemento HTML direto e damos foco
inputRef.current.focus();
inputRef.current.style.borderColor = 'cyan';
}
return (
<div>
<h1>🚀 Coordenadas de Salto</h1>
{/* 2. Ligamos a referência à tag HTML */}
<input
ref={inputRef}
type="text"
value={coordenadas}
onChange={(e) => setCoordenadas(e.target.value)}
placeholder="Digite as coordenadas..."
/>
<button onClick={focarNoInput}>Focar Mira</button>
</div>
)
}
export default App;🕹️ Como Executar e Testar no VS Code
- Salve e veja o navegador.
- Clique no botão “Focar Mira”. O cursor do teclado vai pular direto para dentro da caixa de texto e a borda ficará azul (cyan)!
🛠️ Prática Obrigatória 1
Use o useRef para criar um botão “Limpar e Focar”. Quando clicado, ele deve apagar o texto digitado e colocar o cursor de volta no campo.
🛠️ Prática Obrigatória 2
Pesquise sobre createPortal do pacote react-dom e tente criar uma mensagem que seja renderizada fora da div #root do seu HTML.
🔑 Gabarito de Código/Fórmulas
Prática 1:
No App.jsx:
function limparEFocar() {
setCoordenadas(''); // Limpa o estado
inputRef.current.focus(); // Foca
}