0% acharam este documento útil (0 voto)
10 visualizações45 páginas

React Js

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
10 visualizações45 páginas

React Js

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

AULA 1 – Fundamentos do TypeScript

(Parte 1)
🎯 Objetivo da Aula:
Compreender os tipos primitivos e como tipar variáveis, funções e objetos em
TypeScript.

🧠 CONCEITO: O que é TypeScript?


TypeScript é um superconjunto do JavaScript que adiciona tipagem estática.
Ele ajuda a evitar erros e melhora a legibilidade e a manutenção do código.

🛠️ AMBIENTE PARA TESTES


Você pode usar:

●​ Playground oficial TypeScript​

●​ VS Code com um arquivo .ts local (instale o Node.js + TypeScript: npm install
-g typescript)​

📘 1. TIPOS PRIMITIVOS
✅ String
ts
Copiar código
let nome: string = "Darcy";

✅ Number
ts
Copiar código
let idade: number = 28;
✅ Boolean
ts
Copiar código
let ativo: boolean = true;

✅ Any (Evite sempre que possível!)


ts
Copiar código
let valor: any = "texto";
valor = 5; // válido, mas sem segurança

📘 2. ARRAYS
✅ Array de strings
ts
Copiar código
let frutas: string[] = ["maçã", "banana"];

✅ Array de números
ts
Copiar código
let notas: number[] = [10, 8, 7.5];

📘 3. OBJETOS
✅ Objeto com tipagem direta
ts
Copiar código
let usuario: { nome: string; idade: number } = {
nome: "Darcy",
idade: 28
};

✅ Usando interface
ts
Copiar código
interface Usuario {
nome: string;
idade: number;
}

let usuario2: Usuario = {


nome: "Beca",
idade: 27
};

📘 4. FUNÇÕES TIPADAS
✅ Tipagem nos parâmetros e retorno
ts
Copiar código
function saudacao(nome: string): string {
return `Olá, ${nome}`;
}

const resultado = saudacao("Darcy"); // "Olá, Darcy"

🧪 EXERCÍCIO 1
Crie um arquivo chamado aula1.ts com o seguinte conteúdo e preencha os tipos
corretos:

ts
Copiar código
// 1. Crie uma variável chamada 'produto' com tipo string
// 2. Crie uma variável chamada 'preco' com tipo number
// 3. Crie uma função chamada 'calcularDesconto' que recebe preço e
percentual e retorna o preço com desconto
// 4. Crie uma interface chamada 'Livro' com título (string), autor
(string), ano (number)
// 5. Crie um array de livros (3 livros) tipado corretamente

Se quiser, posso corrigir seu exercício ou mostrar o gabarito depois de você tentar.
📝 RESUMO DA AULA 1
●​ Tipos primitivos (string, number, boolean, any)​

●​ Arrays tipados​

●​ Objetos com interface​

●​ Funções com parâmetros e retorno tipado​

AULA 2 – Tipos Avançados (Parte 2)


🎯 Objetivo da Aula:
Aprender os tipos Tuple, Enum, Union, Intersection, Type Alias e Generics.

📘 1. TUPLAS (Tuple)
Uma tupla define a quantidade e tipo de elementos de um array de forma fixa.

ts
Copiar código
let coordenadas: [number, number] = [10.5, 20.3];

Se tentar colocar uma string no lugar de um número, ou trocar a ordem, o TS acusa erro.

📘 2. ENUMS
Enums são usados para representar valores nomeados, geralmente em categorias fixas.

ts
Copiar código
enum StatusPedido {
Pendente,
Processando,
Concluido,
Cancelado
}

let statusAtual: StatusPedido = StatusPedido.Processando;

Você também pode definir valores personalizados:

ts
Copiar código
enum Status {
Ativo = "ativo",
Inativo = "inativo"
}

let usuarioStatus: Status = Status.Ativo;

📘 3. UNION TYPES (|)


Permite que uma variável aceite mais de um tipo.

ts
Copiar código
let resposta: string | number;

resposta = "ok";
resposta = 200;

📘 4. INTERSECTION TYPES (&)


Combina duas interfaces em uma.

ts
Copiar código
interface Pessoa {
nome: string;
}

interface Funcionario {
cargo: string;
}

type PessoaFuncionario = Pessoa & Funcionario;

const colaborador: PessoaFuncionario = {


nome: "Darcy",
cargo: "Dev Full Stack"
};

📘 5. TYPE ALIAS (type)


Um apelido para tipos reutilizáveis, inclusive com union ou intersection.

ts
Copiar código
type ID = string | number;

let userId: ID = "abc123";


let postId: ID = 99;

Você também pode criar tipos compostos:

ts
Copiar código
type Produto = {
nome: string;
preco: number;
};

📘 6. GENERICS (<T>)
Permitem tipos dinâmicos com segurança, muito usados em funções e libs.

ts
Copiar código
function mostrarValor<T>(valor: T): T {
return valor;
}
mostrarValor<string>("Olá");
mostrarValor<number>(123);

Outro exemplo: lista genérica

ts
Copiar código
function primeiroItem<T>(lista: T[]): T {
return lista[0];
}

🧪 EXERCÍCIO 2
1.​ Crie uma tupla chamada ponto com dois números (x, y)​

2.​ Crie um enum chamado DiaSemana com valores de Segunda a Domingo​

3.​ Crie uma variável entrada que pode ser string ou number​

4.​ Crie dois types chamados Pessoa e Endereco, e combine os dois com &​

5.​ Crie uma função genérica retornaUltimo<T> que recebe um array e retorna o
último item​

📝 RESUMO DA AULA 2
●​ Tuple → Array com tipos e ordem fixa​

●​ Enum → Conjunto de valores nomeados​

●​ Union → Um tipo ou outro​

●​ Intersection → Combina tipos​

●​ Type → Apelido para tipos​


●​ Generics → Tipos dinâmicos, mas seguros​

AULA 3 – Primeiros passos com React +


TypeScript
🎯 Objetivo da Aula:
●​ Criar o ambiente do projeto React com TypeScript​

●​ Entender a estrutura básica​

●​ Criar o primeiro componente tipado​

📦 1. Criando o projeto React com TypeScript


Abra o terminal e execute:

bash
Copiar código
npx create-react-app meu-projeto --template typescript

Alternativa com Vite (mais leve e rápido):

bash
Copiar código
npm create vite@latest meu-projeto -- --template react-ts
cd meu-projeto
npm install
npm run dev

📁 2. Estrutura inicial do projeto


java
Copiar código
meu-projeto/
├── node_modules/
├── public/
├── src/
│ ├── App.tsx ← nosso componente principal
│ ├── main.tsx ← ponto de entrada
│ ├── vite-env.d.ts
│ └── ...
├── tsconfig.json ← configuração do TypeScript
├── package.json

⚛️ 3. Criando seu primeiro componente com


TypeScript

✅ Crie o componente BoasVindas.tsx


tsx
Copiar código
// src/components/BoasVindas.tsx
type Props = {
nome: string;
}

export function BoasVindas({ nome }: Props) {


return <h2>Olá, {nome}! Seja bem-vindo(a) ao React com
TypeScript!</h2>;
}

✅ Use o componente no App.tsx


tsx
Copiar código
import { BoasVindas } from './components/BoasVindas';

function App() {
return (
<div>
<h1>Meu Primeiro Projeto com React e TS</h1>
<BoasVindas nome="Darcy" />
</div>
);
}

export default App;

🧠 EXPLICAÇÃO
●​ type Props define a interface das propriedades esperadas.​

●​ O React, com TypeScript, exige que você diga que tipo de dados o componente
espera.​

●​ Isso ajuda o editor a sugerir, validar e evitar bugs.​

⚙️ 4. Tipando eventos e estados


✅ Estado com useState
tsx
Copiar código
import { useState } from 'react';

const [contador, setContador] = useState<number>(0);

✅ Evento de clique
tsx
Copiar código
function handleClick(event: React.MouseEvent<HTMLButtonElement>) {
alert("Clicado!");
}

🧪 EXERCÍCIO 3
1.​ Crie um componente Contador.tsx que tenha:​
○​ Um número no estado (useState)​

○​ Um botão para incrementar o número​

○​ Tipagem correta do estado e do evento​

2.​ Utilize esse componente no App.tsx​

Se quiser, posso corrigir o exercício com você depois.

📝 RESUMO DA AULA 3
●​ Criamos o projeto com React e TS​

●​ Entendemos como tipar props​

●​ Vimos como tipar useState e eventos​

●​ Começamos a montar componentes reutilizáveis​

AULA 4 – Props, useState e useEffect


com Tipagem
🎯 Objetivo da Aula:
●​ Entender a passagem de props com tipos​

●​ Usar useState com tipagem correta​

●​ Trabalhar com useEffect para efeitos colaterais​

📘 1. Relembrando Props Tipadas


Props são os dados que você envia de um componente pai para um filho.
✅ Exemplo:
// src/components/Saudacao.tsx
type SaudacaoProps = {
nome: string;
idade?: number; // idade é opcional
};

export function Saudacao({ nome, idade }: SaudacaoProps) {


return (
<div>
<h2>Olá, {nome}!</h2>
{idade && <p>Idade: {idade} anos</p>}
</div>
);
}

tsx
Copiar código
// App.tsx
import { Saudacao } from './components/Saudacao';

function App() {
return <Saudacao nome="Darcy" idade={28} />;
}

📘 2. useState Tipado
O hook useState cria um estado no componente. Com TypeScript, você define o tipo do
valor armazenado.

✅ Exemplo com número:


tsx
Copiar código
const [contador, setContador] = useState<number>(0);

✅ Exemplo com string ou nulo:


tsx
Copiar código
const [nome, setNome] = useState<string | null>(null);

✅ Exemplo com objeto:


tsx
Copiar código
type Usuario = {
nome: string;
email: string;
};

const [usuario, setUsuario] = useState<Usuario | null>(null);

📘 3. useEffect Tipado
O useEffect permite executar efeitos colaterais como buscar dados ou rodar lógica ao
montar/desmontar o componente.

✅ Exemplo simples:
tsx
Copiar código
useEffect(() => {
console.log('Componente montado!');
}, []);

✅ Exemplo com setTimeout:


const [mensagem, setMensagem] = useState<string>("Carregando...");

useEffect(() => {
setTimeout(() => {
setMensagem("Bem-vindo ao sistema!");
}, 2000);
}, []);

📘 4. Evento tipado + estado


tsx
Copiar código
function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {
setNome(e.target.value);
}

🧪 EXERCÍCIO 4
1.​ Crie um componente PerfilUsuario.tsx que:​

○​ Receba nome e email via props​

○​ Mostre os dados na tela​

2.​ No componente, use useEffect para simular o carregamento com:​

○​ Mensagem inicial: "Carregando..."​

○​ Depois de 2 segundos, mostrar o nome e email recebidos​

📝 RESUMO DA AULA 4
●​ Props devem sempre ser tipadas​

●​ useState<T>() define o tipo do estado​

●​ useEffect() é executado com base em mudanças de estado ou props​

●​ Eventos (onChange, onClick etc.) devem ser tipados​

AULA 5 – Listas, Eventos e


Comunicação entre Componentes
🎯 Objetivos da Aula:
●​ Renderizar listas com tipagem​

●​ Manipular eventos em elementos da lista​

●​ Enviar funções como props para componentes filhos​

📦 1. Trabalhando com listas tipadas


Você geralmente vai iterar sobre arrays com .map().

✅ Exemplo com lista de tarefas:


tsx
Copiar código
type Tarefa = {
id: number;
titulo: string;
};

const tarefas: Tarefa[] = [


{ id: 1, titulo: 'Estudar React' },
{ id: 2, titulo: 'Fazer exercícios' },
{ id: 3, titulo: 'Descansar' },
];

✅ Renderizando a lista:
tsx
Copiar código
return (
<ul>
{tarefas.map((tarefa) => (
<li key={tarefa.id}>{tarefa.titulo}</li>
))}
</ul>
);

📦 2. Lidando com eventos da lista


Você pode criar botões para interagir com cada item.

✅ Exemplo com botão de remover:


tsx
Copiar código
function removerTarefa(id: number) {
console.log(`Removendo tarefa com id ${id}`);
}

return (
<ul>
{tarefas.map((tarefa) => (
<li key={tarefa.id}>
{tarefa.titulo}
<button onClick={() =>
removerTarefa(tarefa.id)}>Remover</button>
</li>
))}
</ul>
);

📦 3. Comunicação entre componentes (Callback como


prop)
Você pode passar funções do pai para o filho como props. Isso permite que o filho acione
ações no pai.

✅ Exemplo:
Componente Pai (App.tsx):

tsx
Copiar código
import { ListaTarefas } from './components/ListaTarefas';

function App() {
function aoRemover(id: number) {
alert(`Remover tarefa com ID: ${id}`);
}

return <ListaTarefas aoRemover={aoRemover} />;


}

Componente Filho (ListaTarefas.tsx):

tsx
Copiar código
type Tarefa = {
id: number;
titulo: string;
};

type Props = {
aoRemover: (id: number) => void;
};

export function ListaTarefas({ aoRemover }: Props) {


const tarefas: Tarefa[] = [
{ id: 1, titulo: 'Estudar React' },
{ id: 2, titulo: 'Praticar TypeScript' },
];

return (
<ul>
{tarefas.map((tarefa) => (
<li key={tarefa.id}>
{tarefa.titulo}
<button onClick={() =>
aoRemover(tarefa.id)}>Remover</button>
</li>
))}
</ul>
);
}

🧪 EXERCÍCIO 5
Crie um componente chamado ListaDeProdutos.tsx que:

Receba uma lista de produtos via prop:​



ts​
Copiar código​
type Produto = {
id: number;
nome: string;
preco: number;
}

1.​
2.​ Para cada produto, exiba nome e preço formatado (ex: R$ 10,00)​

3.​ Ao clicar em "Comprar", dispare uma função passada por prop: aoComprar(id:
number)​

📝 RESUMO DA AULA 5
●​ Tipamos listas com Array<T> ou T[]​

●​ key é obrigatório no .map() para performance​

●​ Eventos são tipados com base no elemento (React.MouseEvent)​

●​ Podemos passar funções como props para permitir comunicação do filho para o pai​

AULA 6 – Formulários e Controle de


Inputs
🎯 Objetivo:
●​ Criar formulários controlados​

●​ Trabalhar com inputs em React + TypeScript​

●​ Tipar eventos e dados de formulários​


🧩 1. O que é um formulário controlado?
Formulários controlados são aqueles em que o valor do input vem do estado (useState). O
React mantém o valor e reage a qualquer mudança.

🧪 2. Exemplo simples com useState


tsx
Copiar código
import { useState } from 'react';

export function Formulario() {


const [nome, setNome] = useState<string>('');

function handleSubmit(e: React.FormEvent<HTMLFormElement>) {


e.preventDefault();
alert(`Nome enviado: ${nome}`);
}

return (
<form onSubmit={handleSubmit}>
<label>
Nome:
<input
type="text"
value={nome}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setNome(e.target.value)
}
/>
</label>
<button type="submit">Enviar</button>
</form>
);
}

📘 3. Múltiplos campos no formulário


tsx
Copiar código
type FormularioDados = {
nome: string;
email: string;
};

const [dados, setDados] = useState<FormularioDados>({


nome: '',
email: '',
});

function handleChange(e: React.ChangeEvent<HTMLInputElement>) {


const { name, value } = e.target;
setDados((prev) => ({ ...prev, [name]: value }));
}

return (
<form onSubmit={...}>
<input name="nome" value={dados.nome} onChange={handleChange} />
<input name="email" value={dados.email} onChange={handleChange}
/>
</form>
);

📋 4. Select, Checkbox e outros tipos


✅ Select
tsx
Copiar código
<select
value={opcao}
onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>
setOpcao(e.target.value)}
>
<option value="frontend">Frontend</option>
<option value="backend">Backend</option>
</select>

✅ Checkbox
tsx
Copiar código
<input
type="checkbox"
checked={aceito}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setAceito(e.target.checked)}
/>

⚠️ 5. Eventos Tipados no React


●​ onChange: React.ChangeEvent<HTMLInputElement>​

●​ onSubmit: React.FormEvent<HTMLFormElement>​

●​ onClick: React.MouseEvent<HTMLButtonElement>​

🧪 EXERCÍCIO 6
Crie um componente chamado CadastroProduto.tsx que:

1.​ Tenha os campos:​

○​ Nome do produto (string)​

○​ Preço (number)​

○​ Disponível? (checkbox)​

2.​ Ao submeter o formulário, exiba os dados no console (ou alert)​

3.​ Use tipagem correta para todos os estados e eventos​

📝 RESUMO DA AULA 6
●​ Inputs controlados com useState garantem controle total do formulário​

●​ Eventos em React com TypeScript precisam de tipos específicos​

●​ Checkbox, Select e outros inputs também precisam de atenção especial​

AULA 7 – Estilização com CSS Modules


em React + TypeScript
🎯 Objetivo:
●​ Aprender a usar CSS Modules para estilizar componentes React​

●​ Garantir que os estilos sejam isolados por componente​

●​ Integrar o CSS Modules com TypeScript​

🧩 1. O que são CSS Modules?


CSS Modules permitem escrever CSS local para cada componente, evitando conflitos de
nomes de classes.

O arquivo termina com .module.css.

🧪 2. Criando um CSS Module


1. Crie um arquivo chamado:

📄 Botao.module.css
css
Copiar código
.botao {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 1rem;
}

.botao:hover {
background-color: #0056b3;
}

🧪 3. Usando no componente com TypeScript


📄 Botao.tsx
tsx
Copiar código
import styles from './Botao.module.css';

type Props = {
texto: string;
onClick: () => void;
};

export function Botao({ texto, onClick }: Props) {


return (
<button className={styles.botao} onClick={onClick}>
{texto}
</button>
);
}

🔒 O className={styles.botao} garante que o nome seja único.

✅ 4. Vantagens do CSS Module


●​ Escopo local: sem conflito de nomes​
●​ Ótimo para grandes projetos​

●​ Facilidade de manutenção​

⚠️ 5. Cuidados com TypeScript


Se o VS Code não reconhecer styles.botao, pode ser necessário declarar os tipos de
módulos CSS:

📄 Criar arquivo global.d.ts (caso necessário):


ts
Copiar código
declare module '*.module.css' {
const classes: { [key: string]: string };
export default classes;
}

🧪 EXERCÍCIO 7
Crie um componente CardProduto.tsx que:

1.​ Recebe props:​

○​ nome (string)​

○​ preco (number)​

2.​ Estilize com CardProduto.module.css:​

○​ Fundo claro​

○​ Borda arredondada​

○​ Nome grande​

○​ Preço em destaque​

3.​ Use className={styles.algumaCoisa} corretamente com TypeScript​


📝 RESUMO DA AULA 7
●​ CSS Modules encapsulam estilos por componente​

●​ Tipagem funciona naturalmente com TypeScript​

●​ Criar arquivos .module.css e importar com import styles from​

AULA 8 – children, Composição e


Componentes Reutilizáveis
🎯 Objetivo:
●​ Entender o conceito de composição de componentes​

●​ Usar props.children para criar componentes flexíveis​

●​ Aprender a tipar children com TypeScript​

📦 1. O que é composição em React?


React incentiva a composição: construir componentes maiores a partir de menores.

Exemplo:​
Um <Card> pode envolver qualquer conteúdo.

🔤 2. Usando children
Exemplo 1 – Componente Container
tsx
Copiar código
type Props = {
children: React.ReactNode;
};

export function Container({ children }: Props) {


return (
<div style={{ padding: '20px', border: '1px solid gray' }}>
{children}
</div>
);
}

Usando no App:
tsx
Copiar código
<Container>
<h2>Título</h2>
<p>Esse conteúdo está dentro do Container!</p>
</Container>

🔁 3. Reutilização com flexibilidade


Imagine que temos um componente Alerta:

tsx
Copiar código
type Props = {
tipo: 'sucesso' | 'erro';
children: React.ReactNode;
};

export function Alerta({ tipo, children }: Props) {


const cor = tipo === 'sucesso' ? 'green' : 'red';

return (
<div style={{ color: 'white', backgroundColor: cor, padding:
'10px' }}>
{children}
</div>
);
}
Uso:
tsx
Copiar código
<Alerta tipo="sucesso">
Produto cadastrado com sucesso!
</Alerta>

✅ 4. Quando usar children?


Use children quando quiser que o conteúdo seja definido fora do componente, como:

●​ Layouts​

●​ Modais​

●​ Cards​

●​ Containers​

●​ Alertas​

●​ Botões com ícone + texto​

🧪 EXERCÍCIO 8
Crie o componente Card.tsx:

1.​ Deve ter:​

○​ Borda​

○​ Padding​

○​ Título (via prop)​

○​ Conteúdo flexível (via children)​


2.​ Exemplo de uso:​

tsx
Copiar código
<Card titulo="Informações do Produto">
<p>Nome: Camisa Polo</p>
<p>Preço: R$ 59,90</p>
</Card>

3.​ Estilize com Card.module.css​

📝 RESUMO DA AULA 8
●​ children permite componentes com conteúdo interno personalizado​

●​ Tipamos com React.ReactNode​

●​ Ideal para layouts e composição reutilizável

AULA 9 – React Router DOM +


TypeScript
🎯 Objetivo:
●​ Instalar e configurar o React Router DOM​

●​ Criar rotas com navegação​

●​ Tipar parâmetros de rota com TypeScript​

🧩 1. O que é o React Router DOM?


É a biblioteca mais usada para criar navegação entre páginas em projetos React (SPA –
Single Page Application).

⚙️ 2. Instalação
Execute:

bash
Copiar código
npm install react-router-dom

Para projetos TypeScript, também instale os tipos:

bash
Copiar código
npm install --save-dev @types/react-router-dom

🧪 3. Configuração básica
📄 App.tsx
tsx
Copiar código
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import Sobre from './pages/Sobre';

export function App() {


return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/sobre" element={<Sobre />} />
</Routes>
</BrowserRouter>
);
}
🧭 4. Criando os componentes das páginas
📄 pages/Home.tsx
tsx
Copiar código
export default function Home() {
return <h1>Página Inicial</h1>;
}

📄 pages/Sobre.tsx
tsx
Copiar código
export default function Sobre() {
return <h1>Sobre Nós</h1>;
}

🔗 5. Navegação com <Link>


tsx
Copiar código
import { Link } from 'react-router-dom';

export function Navbar() {


return (
<nav>
<Link to="/">Início</Link> | <Link to="/sobre">Sobre</Link>
</nav>
);
}

🔄 6. Parâmetros de Rota
Exemplo: /produto/123

📄 Rota:
tsx
Copiar código
<Route path="/produto/:id" element={<Produto />} />

📄 Componente:
tsx
Copiar código
import { useParams } from 'react-router-dom';

export default function Produto() {


const { id } = useParams<{ id: string }>();

return <h2>Produto ID: {id}</h2>;


}

🧪 EXERCÍCIO 9
1.​ Crie as páginas:​

○​ Home​

○​ Contato​

○​ Produto (rota com /produto/:id)​

2.​ Crie um menu de navegação com <Link>​

3.​ Ao clicar em um produto da lista (ex: Produto 1), redirecione para /produto/1​

📝 RESUMO DA AULA 9
●​ react-router-dom gerencia rotas em SPAs​

●​ Usa <Routes> e <Route> para declarar as rotas​

●​ <Link> cria navegação sem recarregar a página​

●​ Parâmetros são acessados com useParams​


AULA 10 – Consumindo APIs com Axios
+ TypeScript
🎯 Objetivo:
●​ Instalar e configurar o Axios​

●​ Fazer requisições GET, POST, etc.​

●​ Tipar os dados que vêm da API​

●​ Tratar erros​

⚙️ 1. Instalação
bash
Copiar código
npm install axios

🧩 2. Criando uma API falsa para testes


(JSONPlaceholder)
Vamos usar a API pública de teste:

●​ https://jsonplaceholder.typicode.com/posts​

🧪 3. Fazendo uma requisição GET


📄 Criando o tipo da resposta:
ts
Copiar código
type Post = {
id: number;
title: string;
body: string;
};

📄 Componente com useEffect:


tsx
Copiar código
import { useEffect, useState } from 'react';
import axios from 'axios';

export function ListaDePosts() {


const [posts, setPosts] = useState<Post[]>([]);
const [carregando, setCarregando] = useState(true);

useEffect(() => {
axios
.get<Post[]>('https://jsonplaceholder.typicode.com/posts')
.then((res) => {
setPosts(res.data);
setCarregando(false);
})
.catch((err) => {
console.error('Erro ao buscar posts:', err);
setCarregando(false);
});
}, []);

if (carregando) return <p>Carregando posts...</p>;

return (
<ul>
{posts.map((post) => (
<li key={post.id}>
<strong>{post.title}</strong>
<p>{post.body}</p>
</li>
))}
</ul>
);
}
📥 4. Enviando dados com POST
Exemplo:
tsx
Copiar código
function criarPost() {
axios
.post('https://jsonplaceholder.typicode.com/posts', {
title: 'Novo Post',
body: 'Conteúdo do post',
userId: 1,
})
.then((res) => {
console.log('Post criado:', res.data);
})
.catch((err) => {
console.error('Erro ao criar post:', err);
});
}

✅ 5. Boas práticas com Axios


●​ Criar uma instância:​

tsx
Copiar código
const api = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com',
});

●​ Usar em outros arquivos:​

tsx
Copiar código
api.get<Post[]>('/posts');
api.post('/posts', { title: '...', body: '...' });
🧪 EXERCÍCIO 10
1.​ Crie um componente chamado ListaDeUsuarios.tsx​

2.​ Busque dados da rota https://jsonplaceholder.typicode.com/users​

3.​ Tipagem:​

ts
Copiar código
type Usuario = {
id: number;
name: string;
email: string;
};

4.​ Mostre os nomes e e-mails dos usuários​

📝 RESUMO DA AULA 10
●​ axios facilita o consumo de APIs​

●​ Tipamos as respostas com <T> no .get<T>()​

●​ Usamos useEffect para chamadas automáticas​

●​ Tratamos erros com .catch()

AULA 11 – Context API + TypeScript


🎯 Objetivo:
●​ Entender o que é a Context API​

●​ Criar um contexto global com TypeScript​


●​ Compartilhar dados entre componentes sem "props drilling"​

🧠 1. O que é Context API?


É uma ferramenta do React para compartilhar dados globalmente entre componentes,
sem precisar passar props manualmente por todos os níveis da árvore de componentes.

🧩 2. Exemplo prático – Autenticação de Usuário


Vamos simular um contexto de usuário logado.

📄 3. Criando o Contexto
1. Tipagem:
ts
Copiar código
type Usuario = {
nome: string;
email: string;
};

type UsuarioContextType = {
usuario: Usuario | null;
login: (usuario: Usuario) => void;
logout: () => void;
};

2. Criando o contexto:

import { createContext, useState, ReactNode, useContext } from


'react';

const UsuarioContext = createContext<UsuarioContextType |


undefined>(undefined);
export function UsuarioProvider({ children }: { children: ReactNode
}) {
const [usuario, setUsuario] = useState<Usuario | null>(null);

function login(user: Usuario) {


setUsuario(user);
}

function logout() {
setUsuario(null);
}

return (
<UsuarioContext.Provider value={{ usuario, login, logout }}>
{children}
</UsuarioContext.Provider>
);
}

3. Criando o hook personalizado:

export function useUsuario() {


const context = useContext(UsuarioContext);
if (!context) {
throw new Error('useUsuario deve ser usado dentro de
UsuarioProvider');
}
return context;
}

📦 4. Usando no App
Envolvendo tudo com o Provider:

import { UsuarioProvider } from './contexts/UsuarioContext';

export function App() {


return (
<UsuarioProvider>
<MinhaPagina />
</UsuarioProvider>
);
}

🧪 5. Usando o contexto em qualquer lugar


tsx
Copiar código
import { useUsuario } from '../contexts/UsuarioContext';

export function Header() {


const { usuario, logout } = useUsuario();

return (
<header>
{usuario ? (
<>
<p>Bem-vindo, {usuario.nome}</p>
<button onClick={logout}>Sair</button>
</>
) : (
<p>Usuário não logado</p>
)}
</header>
);
}

🧪 EXERCÍCIO 11
1.​ Crie um contexto chamado TemaContext​

2.​ Ele deve armazenar:​

○​ Um estado: tema: 'claro' | 'escuro'​


○​ Uma função alternarTema()​

3.​ Use o TemaContext para:​

○​ Mostrar o tema atual em um componente​

○​ Ter um botão que alterna o tema​

📝 RESUMO DA AULA 11
●​ Context API permite estado global entre componentes​

●​ Tipamos o contexto com createContext<Type | undefined>​

●​ Hooks personalizados ajudam a reutilizar lógica de forma limpa

AULA 12 – Custom Hooks com


TypeScript
🎯 Objetivo:
●​ Entender o que são hooks personalizados (custom hooks)​

●​ Criar hooks reutilizáveis e organizados​

●​ Tipar corretamente parâmetros e retornos com TypeScript​

🧠 1. O que é um Custom Hook?


Um custom hook é uma função que começa com use e reutiliza lógica de hooks React
(como useState, useEffect, etc.).

Ele facilita a organização e reaproveitamento de código.


📦 2. Exemplo prático – Hook de contador
📄 useContador.ts
import { useState } from 'react';

export function useContador(valorInicial: number = 0) {


const [contador, setContador] = useState<number>(valorInicial);

function incrementar() {
setContador((prev) => prev + 1);
}

function decrementar() {
setContador((prev) => prev - 1);
}

function resetar() {
setContador(valorInicial);
}

return { contador, incrementar, decrementar, resetar };


}

🧪 3. Usando o custom hook


📄 Contador.tsx
import { useContador } from '../hooks/useContador';

export function Contador() {


const { contador, incrementar, decrementar, resetar } =
useContador(10);

return (
<div>
<h2>Contador: {contador}</h2>
<button onClick={incrementar}>+</button>
<button onClick={decrementar}>-</button>
<button onClick={resetar}>Resetar</button>
</div>
);
}

✅ 4. Regras dos Hooks personalizados


●​ O nome deve começar com use​

●​ Pode usar outros hooks (ex: useState, useEffect)​

●​ Não pode ser chamado fora de componentes ou outros hooks​

🧪 EXERCÍCIO 12
Crie um hook chamado useTempoAtual:

1.​ Ele deve:​

○​ Retornar a hora atual (new Date().toLocaleTimeString())​

○​ Atualizar o tempo a cada segundo​

2.​ Use setInterval dentro de useEffect​

3.​ Use em um componente Relogio.tsx com:

<h2>Hora atual: {tempo}</h2>

📝 RESUMO DA AULA 12
●​ Custom hooks encapsulam lógica reutilizável​

●​ Tipamos parâmetros e retorno normalmente​

●​ Ideal para organizar código e manter componentes limpos​


AULA 13 – Formulários com React +
TypeScript
🎯 Objetivo:
●​ Criar formulários controlados com useState​

●​ Tipar corretamente os dados do formulário​

●​ Fazer uma validação básica antes do envio​

🧠 1. Conceito: Formulário controlado


No React, formulário controlado é quando o valor de um input é armazenado no estado
(useState).

🧾 2. Estrutura básica com TypeScript


Exemplo: formulário de cadastro de usuário

import { useState } from 'react';

type FormularioUsuario = {
nome: string;
email: string;
};

export function FormularioCadastro() {


const [form, setForm] = useState<FormularioUsuario>({
nome: '',
email: '',
});

function handleChange(e: React.ChangeEvent<HTMLInputElement>) {


const { name, value } = e.target;
setForm((prev) => ({
...prev,
[name]: value,
}));
}

function handleSubmit(e: React.FormEvent) {


e.preventDefault();

if (form.nome.trim() === '' || form.email.trim() === '') {


alert('Preencha todos os campos!');
return;
}

console.log('Dados enviados:', form);


alert(`Usuário cadastrado com sucesso!`);
}

return (
<form onSubmit={handleSubmit}>
<div>
<label>Nome:</label>
<input type="text" name="nome" value={form.nome}
onChange={handleChange} />
</div>

<div>
<label>Email:</label>
<input type="email" name="email" value={form.email}
onChange={handleChange} />
</div>

<button type="submit">Cadastrar</button>
</form>
);
}

✅ 3. Pontos importantes
●​ Tipamos o objeto do formulário com type FormularioUsuario​

●​ Usamos e: React.ChangeEvent<HTMLInputElement> para o onChange​

●​ Usamos e: React.FormEvent no onSubmit​

🧪 EXERCÍCIO 13
1.​ Crie um componente chamado FormularioProduto​

2.​ O formulário deve conter:​

○​ Nome do produto​

○​ Preço (number)​

○​ Quantidade (number)​

3.​ Mostre os dados no console ao enviar​

4.​ Valide:​

○​ Nome obrigatório​

○​ Preço e quantidade devem ser > 0​

📝 RESUMO DA AULA 13
●​ Formulários controlados usam useState​

●​ Tipamos os campos com objetos específicos​

●​ Validação básica pode ser feita antes do envio​

●​ TypeScript ajuda a evitar erros comuns​


👨‍🏫 Próxima aula:
Aula 14 – Estilização com CSS Modules + Condicionais com classe

Deseja fazer o exercício do FormularioProduto agora ou seguimos direto para a Aula


14?

Ferramentas
O ChatGPT pode cometer erros. Considere verificar inform

Você também pode gostar