Skip to Content
PortuguêsDocumentação JumentixPacotes@jumentix/canaCana com Vue 3 e Pinia

Cana com Vue 3 e Pinia

Construa o sistema de tarefas categorizadas com Vue 3 e Pinia. O Cana possui o armazenamento durável no browser, enquanto o Pinia possui o estado reativo que os componentes renderizam.

1. Comece do zero

bun create vite cana-vue-pinia --template vue-ts cd cana-vue-pinia bun add @jumentix/cana @jumentix/cana-vue pinia

Registre Pinia em main.ts, crie src/cana.ts e então defina stores em src/stores.

2. Implementação simples

A action simples init() abre o Cana, carrega as tabelas atuais e retorna a função de unsubscribe de client.subscribe.

Componentes chamam actions da store:

  • tasks.addTask(title, categoryId)
  • tasks.toggleTask(task)

A store atualiza seus arrays a partir de CanaChangeEvent, então todo componente que usa a store renderiza novamente com o estado confirmado no storage.

Vue 3 + Pinia
simple

Vue 3 + Pinia: store atualizada pelo Cana

Actions Pinia escrevem no Cana e atualizam estado por eventos confirmados.

Baixar app
{
  "name": "cana-vue-pinia-tasks",
  "private": true,
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc -b && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "@jumentix/cana": "^0.1.0",
    "@jumentix/cana-vue": "^0.1.0",
    "@vitejs/plugin-vue": "^6.0.5",
    "pinia": "^4.0.3",
    "typescript": "^6.0.3",
    "vite": "^7.2.7",
    "vue": "^3.5.41",
    "vue-tsc": "^3.1.8"
  }
}

3. Implementação avançada

A store avançada mantém lastCursor em localStorage, assina com sinceCursor e recarrega todas as tabelas quando o cursor de replay não está mais disponível. Ela também grava categoria e primeira tarefa em uma transação Cana.

Use onUnmounted(() => stop()) em componentes ou lógica de teardown para que views antigas não continuem aplicando eventos depois da navegação.

Vue 3 + Pinia
advanced

Vue 3 + Pinia: fluxo transacional com replay

A store Pinia guarda o ultimo cursor do Cana e recarrega quando o replay nao esta disponivel.

Baixar app
{
  "name": "cana-vue-pinia-tasks",
  "private": true,
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc -b && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "@jumentix/cana": "^0.1.0",
    "@jumentix/cana-vue": "^0.1.0",
    "@vitejs/plugin-vue": "^6.0.5",
    "pinia": "^4.0.3",
    "typescript": "^6.0.3",
    "vite": "^7.2.7",
    "vue": "^3.5.41",
    "vue-tsc": "^3.1.8"
  }
}

4. Formato final do app

src/
  cana.ts
  main.ts
  App.vue
  stores/
    tasks.ts
    advancedTasks.ts

Getters do Pinia devem conter visões derivadas, como tarefas por categoria, não cópias duplicadas dos dados do Cana.

Baixe o app Vite completo usado pelo exemplo avançado: cana-vue-pinia.zip.

5. Checklist

  • createPinia() é instalado antes dos componentes usarem stores.
  • init() abre o Cana, carrega tabelas e então assina eventos.
  • onUnmounted cancela listeners.
  • Actions da store escrevem no Cana e estado atualiza por eventos confirmados.
  • Fluxos avançados recarregam tabelas quando replay não está disponível.

Próximo

Compare o mesmo modelo em React Context e React Redux.