🧩 Exercícios: Gerenciamento de Estado com useState e Imutabilidade
Spec Frontend Com React • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 03.1 — Estado Simples e Atualização Funcional (setCount(prev => prev + 1))
Contexto: Estado Simples e Atualização Funcional (setCount(prev => prev + 1)) no contexto de Gerenciamento de Estado com useState e Imutabilidade.
Requisitos de Execução:
- Criar contador com botões de incremento, decremento e reset usando atualização funcional para evitar stale closures.
Resultado Esperado
Contador atualizado com segurança sem perdas de estado concorrente.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_1_SeuNome - Envie na tarefa:
Atividade Cap 03 - Gerenciamento de Estado com useState e Imutabilidade
🔑 Gabarito de Código & Solução Comentada
// Contador.tsx
import React, { useState } from 'react';
export const Contador: React.FC = () => {
const [count, setCount] = useState<number>(0);
const incrementar = () => setCount(prev => prev + 1);
const decrementar = () => setCount(prev => Math.max(0, prev - 1));
return (
<div>
<p>Valor: {count}</p>
<button onClick={incrementar}>+1</button>
<button onClick={decrementar}>-1</button>
</div>
);
};
🔍 Nível 2: Prática
Problema 03.2 — Manipulação de Objetos Complexos com Spread Operator
Contexto: Manipulação de Objetos Complexos com Spread Operator no contexto de Gerenciamento de Estado com useState e Imutabilidade.
Requisitos de Execução:
- Gerenciar estado de formulário de perfil atualizando apenas o campo modificado com
setUser(prev => ({ ...prev, [field]: value })).
Resultado Esperado
Campos de formulário atualizados preservando os demais atributos do objeto.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_2_SeuNome - Envie na tarefa:
Atividade Cap 03 - Gerenciamento de Estado com useState e Imutabilidade
🔑 Gabarito de Código & Solução Comentada
// FormPerfil.tsx
import React, { useState, ChangeEvent } from 'react';
interface Perfil { nome: string; email: string; bio: string; }
export const FormPerfil: React.FC = () => {
const [perfil, setPerfil] = useState<Perfil>({ nome: '', email: '', bio: '' });
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
const { name, value } = e.target;
setPerfil(prev => ({ ...prev, [name]: value }));
};
return <input name="nome" value={perfil.nome} onChange={handleChange} />;
};
⚡ Nível 3: Integração
Problema 03.3 — Gerenciamento Imutável de Arrays (Adição, Remoção e Edição)
Contexto: Gerenciamento Imutável de Arrays (Adição, Remoção e Edição) no contexto de Gerenciamento de Estado com useState e Imutabilidade.
Requisitos de Execução:
- Implementar lista de tarefas (Todo List) com adição via
[...prev, novo], remoção com.filter()e toggle com.map().
Resultado Esperado
Operações em lista executadas sem mutações diretas no array original.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_3_SeuNome - Envie na tarefa:
Atividade Cap 03 - Gerenciamento de Estado com useState e Imutabilidade
🔑 Gabarito de Código & Solução Comentada
// TodoList.tsx
import React, { useState } from 'react';
interface Todo { id: number; text: string; done: boolean; }
export const TodoList: React.FC = () => {
const [todos, setTodos] = useState<Todo[]>([]);
const toggleTodo = (id: number) => {
setTodos(prev => prev.map(t => t.id === id ? { ...t, done: !t.done } : t));
};
const removeTodo = (id: number) => {
setTodos(prev => prev.filter(t => t.id !== id));
};
return <div>{todos.length} tarefas</div>;
};
🏆 Nível 4: Desafio Corporativo
Problema 03.4 — Imutabilidade Estrutural com Immer (useImmer)
Contexto: Imutabilidade Estrutural com Immer (useImmer) no contexto de Gerenciamento de Estado com useState e Imutabilidade.
Requisitos de Execução:
- Atualizar árvore de estado profundamente aninhada (3 níveis) usando Immer sem poluição de spreads.
Resultado Esperado
Mutação declarativa e segura de objetos profundos com rascunho Immer.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_03_4_SeuNome - Envie na tarefa:
Atividade Cap 03 - Gerenciamento de Estado com useState e Imutabilidade
🔑 Gabarito de Código & Solução Comentada
// DeepStateImmer.tsx
import { useImmer } from 'use-immer';
export const DeepConfigManager = () => {
const [config, updateConfig] = useImmer({
theme: { colors: { primary: '#0070f3', dark: { background: '#111' } } }
});
const changeBg = (color: string) => {
updateConfig(draft => {
draft.theme.colors.dark.background = color;
});
};
return <button onClick={() => changeBg('#000')}>Mudar Fundo</button>;
};