🧩 Exercícios: Estados Complexos com useReducer e Redutores Puros
Spec Frontend Com React • Trilha Progressiva em 4 Níveis
🧭 Navegação Pedagógica
-
📖 Teoria do Capítulo 💻 Exemplos 📊 Slides 🧠 Quiz
🎯 Nível 1: Fundamentos
Problema 07.1 — Redutor Básico com Ações Tipadas (Discriminated Unions)
Contexto: Redutor Básico com Ações Tipadas (Discriminated Unions) no contexto de Estados Complexos com useReducer e Redutores Puros.
Requisitos de Execução:
- Criar
cartReducergerenciando açõesADD_ITEM,REMOVE_ITEMeCLEAR_CARTcom tipagem estrita.
Resultado Esperado
Redutor processou ação ADD_ITEM atualizando o total do carrinho de compras.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_1_SeuNome - Envie na tarefa:
Atividade Cap 07 - Estados Complexos com useReducer e Redutores Puros
🔑 Gabarito de Código & Solução Comentada
// cartReducer.ts
export interface CartItem { id: number; nome: string; preco: number; qtd: number; }
export interface CartState { items: CartItem[]; total: number; }
export type CartAction =
| { type: 'ADD_ITEM'; payload: CartItem }
| { type: 'REMOVE_ITEM'; payload: { id: number } }
| { type: 'CLEAR_CART' };
export function cartReducer(state: CartState, action: CartAction): CartState {
switch (action.type) {
case 'ADD_ITEM':
return { ...state, items: [...state.items, action.payload] };
case 'CLEAR_CART':
return { items: [], total: 0 };
default:
return state;
}
}
🔍 Nível 2: Prática
Problema 07.2 — Componente Carrinho de Compras com useReducer
Contexto: Componente Carrinho de Compras com useReducer no contexto de Estados Complexos com useReducer e Redutores Puros.
Requisitos de Execução:
- Conectar
cartReducerao componente de UI disparando ações comdispatch({ type: 'ADD_ITEM', payload }).
Resultado Esperado
Interface reativa refletindo adições e remoções do carrinho.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_2_SeuNome - Envie na tarefa:
Atividade Cap 07 - Estados Complexos com useReducer e Redutores Puros
🔑 Gabarito de Código & Solução Comentada
// CartView.tsx
import React, { useReducer } from 'react';
import { cartReducer, CartState } from './cartReducer';
const initialState: CartState = { items: [], total: 0 };
export const CartView: React.FC = () => {
const [state, dispatch] = useReducer(cartReducer, initialState);
return (
<div>
<h4>Carrinho ({state.items.length} itens)</h4>
<button onClick={() => dispatch({ type: 'CLEAR_CART' })}>Limpar</button>
</div>
);
};
⚡ Nível 3: Integração
Problema 07.3 — Máquina de Estados Finita para Requisições HTTP com useReducer
Contexto: Máquina de Estados Finita para Requisições HTTP com useReducer no contexto de Estados Complexos com useReducer e Redutores Puros.
Requisitos de Execução:
- Modelar estados
IDLE,LOADING,SUCCESSeERRORem redutor para data fetching sem estados inconsistentes.
Resultado Esperado
Transições de estado controladas: IDLE -> LOADING -> SUCCESS.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_3_SeuNome - Envie na tarefa:
Atividade Cap 07 - Estados Complexos com useReducer e Redutores Puros
🔑 Gabarito de Código & Solução Comentada
// fetchReducer.ts
interface FetchState<T> { status: 'idle' | 'loading' | 'success' | 'error'; data?: T; error?: string; }
type FetchAction<T> =
| { type: 'START' }
| { type: 'RESOLVE'; payload: T }
| { type: 'REJECT'; error: string };
export function fetchReducer<T>(state: FetchState<T>, action: FetchAction<T>): FetchState<T> {
switch (action.type) {
case 'START': return { status: 'loading' };
case 'RESOLVE': return { status: 'success', data: action.payload };
case 'REJECT': return { status: 'error', error: action.error };
default: return state;
}
}
🏆 Nível 4: Desafio Corporativo
Problema 07.4 — Lazy Initialization e Middleware de Logging em Redutores
Contexto: Lazy Initialization e Middleware de Logging em Redutores no contexto de Estados Complexos com useReducer e Redutores Puros.
Requisitos de Execução:
- Inicializar o estado do redutor recuperando dados do LocalStorage via terceiro argumento
init(initialArg).
Resultado Esperado
Estado recuperado do LocalStorage na montagem inicial.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_4_SeuNome - Envie na tarefa:
Atividade Cap 07 - Estados Complexos com useReducer e Redutores Puros
🔑 Gabarito de Código & Solução Comentada
// PersistentReducer.tsx
import React, { useReducer } from 'react';
function init(key: string) {
const saved = localStorage.getItem(key);
return saved ? JSON.parse(saved) : { count: 0 };
}
export const PersistentCounter = () => {
const [state, dispatch] = useReducer((s: any, a: any) => s, 'counter_key', init);
return <div>Contagem persistida: {state.count}</div>;
};
| ⬅️ Voltar ao Índice de Exercícios | 📚 Sumário de Tópicos |