🧩 Exercícios: Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
🧩 Exercícios Práticos: Cap 02 — Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
Especialização Frontend com Svelte • Trilha de Exercícios Progressivos em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 02.1 — Fixação Conceitual e Sintaxe Inicial
Crie um botão de alternância (toggle) com $state que alterne entre visível e invisível.
Resultado Esperado
Status alternando entre True e False a cada clique.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_1_SeuNome - Envie na tarefa:
Atividade Cap 02 - Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
🔑 Gabarito de Código & Solução Comentada
<!-- Toggle.svelte -->
<script lang="ts">
let visivel = $state(false);
</script>
<button onclick={() => visivel = !visivel}>
{visivel ? 'Ocultar' : 'Exibir'} Detalhes
</button>
{#if visivel}
<p>Conteúdo confidencial revelado com sucesso!</p>
{/if}
🔍 Nível 2: Prática
Problema 02.2 — Aplicação com Regras de Negócio
Crie uma lista de compras reativa com $state permitindo adicionar novos itens a partir de um array.
Resultado Esperado
Novo item adicionado e exibido na lista imediatamente.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_2_SeuNome - Envie na tarefa:
Atividade Cap 02 - Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
🔑 Gabarito de Código & Solução Comentada
<!-- ListaCompras.svelte -->
<script lang="ts">
let itens = $state<string[]>(['Maçã', 'Café']);
let novoItem = $state('');
function adicionar() {
if (novoItem.trim()) {
itens.push(novoItem.trim());
novoItem = '';
}
}
</script>
<input bind:value={novoItem} placeholder="Novo item..." />
<button onclick={adicionar}>Adicionar</button>
<ul>
{#each itens as item}
<li>{item}</li>
{/each}
</ul>
🚀 Nível 3: Integração
Problema 02.3 — Cenário Integrado e Tratamento de Erros
Construa um conversor de moedas reativo com $state para o valor base e $derived para as conversões em USD, EUR e GBP.
Resultado Esperado
Conversões recalculadas em tempo real com base no input em BRL.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_3_SeuNome - Envie na tarefa:
Atividade Cap 02 - Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
🔑 Gabarito de Código & Solução Comentada
<!-- Conversor.svelte -->
<script lang="ts">
let valorBrl = $state(100);
let emUsd = $derived((valorBrl / 5.50).toFixed(2));
let emEur = $derived((valorBrl / 6.00).toFixed(2));
</script>
<label>
Valor em BRL:
<input type="number" bind:value={valorBrl} />
</label>
<p>Em USD: ${emUsd}</p>
<p>Em EUR: €{emEur}</p>
🏆 Nível 4: Desafio Corporativo
Problema 02.4 — Sistema Robusto com Testes e Auditoria
Crie uma classe reativa em TypeScript puro (CarrinhoCompras.svelte.ts) utilizando $state e $derived para gerenciar subtotal, desconto e total geral.
Resultado Esperado
Módulo reativo universal testado com cálculo exato de total e descontos.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_02_4_SeuNome - Envie na tarefa:
Atividade Cap 02 - Reatividade Moderna no Svelte 5 com Runes ($state, $derived)
🔑 Gabarito de Código & Solução Comentada
// CarrinhoCompras.svelte.ts
export interface ItemCarrinho {
id: string;
nome: string;
preco: number;
quantidade: number;
}
export class CarrinhoCompras {
itens = $state<ItemCarrinho[]>([]);
descontoPercentual = $state(0);
subtotal = $derived(
this.itens.reduce((acc, item) => acc + (item.preco * item.quantidade), 0)
);
total = $derived(
this.subtotal * (1 - this.descontoPercentual / 100)
);
adicionar(item: ItemCarrinho) {
this.itens.push(item);
}
}