🧠

Módulo 20: Signals II (Gestão de Estado Moderna)

2. Resumo da Aula Anterior

No Módulo 19, aprendemos os básicos dos Signals: signal(), .set() e .update(). Agora, vamos descobrir como fazer com que estes Signals falem uns com os outros e como reagir a mudanças de forma inteligente usando Computed e Effect.

3. O Que Vais Aprender Hoje

4. Teoria: A Inteligência Artificial da App

Computed: É um Signal que depende de outros. Ele é "preguiçoso": só faz o cálculo se alguém pedir o valor E se os Signals de origem tiverem mudado. Se o valor for o mesmo, ele devolve o resultado guardado (Cache).

Effect: É um vigilante. Ele corre código sempre que um Signal muda, mas não deve ser usado para mudar o estado (HTML), apenas para coisas externas como guardar no Banco de Dados ou fazer animações.

📊 Analogia: A Folha de Excel

Imagina uma folha de cálculo profissional:

  • Signal (Célula A1): Tu escreves o preço de um produto (10€).
  • Computed (Célula B1): Tu escreves a fórmula =A1 * 1.23 (IVA). Tu não precisas de atualizar a B1 à mão. Sempre que mudas a A1, a B1 "acorda", faz a conta por ti e mostra o novo valor.
  • Effect (O Alarme): Imagina que tens uma regra: "Se o total passar dos 100€, toca uma sirene". A sirene não muda as células, apenas reage ao valor final para fazer algo no mundo real.

5. Exemplos Práticos

Exemplo 1: Valores Derivados (Computed)

O computed rastreia as dependências automaticamente.

preco = signal(100);
quantidade = signal(2);

// Este signal atualiza-se sozinho!
total = computed(() => this.preco() * this.quantidade());

console.log(this.total()); // 200 

Exemplo 2: Reagir a Mudanças (Effect)

Ideal para persistência de dados ou logs.

constructor() {
  effect(() => {
    // Sempre que o total mudar, guardamos no log
    console.log(`Log: O novo total é ${this.total()}`);
    localStorage.setItem('total_vendas', this.total().toString());
  });
}

Exemplo 3: No HTML (Limpeza Total)

O HTML fica limpo e sem lógica complexa.

<div>Preço: {{ preco() }}€</div>
<div>Qt: {{ quantidade() }}</div>
<hr>
<strong>Total a pagar: {{ total() }}€</strong>

6. Agora é a Tua Vez!

Vamos criar o "Calculador de Impostos Pro":

  1. Cria um Signal salarioBruto (ex: 2000).
  2. Cria um **Computed** imposto que calcula 20% do salário.
  3. Cria um **Computed** salarioLiquido que subtrai o imposto ao bruto.
  4. No HTML, mostra os três valores.
  5. Cria um **Effect** que faz as contas e guarda o salarioBruto no localStorage sempre que ele mudar.

7. Verificação de Conhecimento

Carregando quiz...

8. Resumo do Que Aprendemos

9. Desafios Práticos

Desafio 1: A Armadilha do Effect

Podes usar o effect() para mudar o valor de um Signal (usando .set())? É uma boa ideia?

Desafio 2: Herança de Inteligência

Um computed pode depender de outro computed? Existe algum limite para estas "correntes"?

Desafio 3: Adeus RxJS?

Agora que temos Signals, ainda precisamos de usar Observables do RxJS para tudo no Angular?

« Aula Anterior Projeto Final »