Pular para conteúdo

Gerenciamento de Estado (Pinia) 🍍

Aula 11 - Estado Global sem Sofrimento


🧩 O Problema do Estado Local

  • Quando muitos componentes precisam do mesmo dado
  • Prop Drilling: Passar dados por 5 níveis de componentes
  • Event Hell: Emitir eventos até o topo e descer de novo

🍍 A Solução: Pinia

  • O sucessor oficial do Vuex
  • Uma "nuvem" de dados acessível por qualquer componente
  • Intuitivo, Tipado e Performante

🏢 Arquitetura da Store

  • State: Onde os dados vivem (ex: lista de favoritos)
  • Actions: Funções que mudam os dados (ex: addFavorito)
  • Getters: Dados derivados/calculados (ex: qtdFavoritos)

🏗️ Criando a Store (Setup Style)

export const useUserStore = defineStore('user', () => {
  const name = ref('Visitante') // State

  function updateName(novo) { // Action
    name.value = novo
  }

  return { name, updateName }
})

🔌 Consumindo no Componente

import { useUserStore } from '@/stores/user'
const store = useUserStore()

// Usando no template:
// {{ store.name }}

📊 Fluxo Global de Dados

graph LR
    A[Componente A] -- muda --> S[Pinia Store]
    B[Componente B] -- lê <-- S
    C[Componente C] -- lê <-- S

⚡ Reatividade do Pinia

  • A store é reativa por padrão
  • Se mudar no Pinia, todos os componentes que usam aquele dado atualizam instantaneamente

🧪 Quando usar Pinia?

  • Dados de Autenticação (User logado)
  • Carrinho de Compras
  • Preferências de Tema (Dark/Light)
  • Dados compartilhados entre rotas diferentes

🕵️ Debbuging com DevTools

  • O Pinia tem integração total com as ferramentas de desenvolvedor
  • Mude o estado manualmente para testar a interface
  • Veja o histórico de todas as ações disparadas

💾 Persistência de Store

  • O Pinia morre ao atualizar a página (F5)
  • Solução: Use plugins como pinia-plugin-persistedstate
  • Salva automaticamente no LocalStorage

🏗️ Store vs Composable

  • Store: Singleton (instância única), dados compartilhados.
  • Composable: Pode ter múltiplas instâncias, cada uma com seu próprio estado.

🚀 Limpando a Store

  • store.$reset(): Volta todos os dados para o valor inicial (apenas em Options Style)
  • Ou crie sua própria função reset

🏗️ Desafio da Aula

  • Criar uma useCartStore (Carrinho)
  • Funcionalidade para Adicionar e Remover Produtos
  • Getter para calcular o valor total
  • Mostrar a quantidade no Header e a lista no Carrinho

🏁 Resumo

  • Pinia centraliza o que é importante
  • State (dado), Actions (mudança), Getters (cálculo)
  • Adeus Prop Drilling!

🏁 Dúvidas?

Bons estados! Próxima aula: Projeto Prático II (CRUD).