Skip to content

Guia completo para

Dominar a Pinia

escrito pelo seu criador

Nuxt.js

Usar a Pinia com a Nuxt é mais fácil uma vez que a Nuxt cuida dum monte de coisas quando esta chega à interpretação do lado do servidor. Por exemplo, não precisamos preocupar-nos com a serialização nem com os ataques de XSS. A Pinia suporta a Nuxt Bridge e a Nuxt 3. Para suporte simples da Nuxt 2, consular abaixo.

Instalação

bash
yarn add @pinia/nuxt
# ou com a npm
npm install @pinia/nuxt

DICA

Se usarmos a npm, podemos deparar-nos com um erro ERESOLVE unable to resolve dependency tree. Neste caso, adicionamos o seguinte ao nosso package.json:

js
"overrides": {
	"vue": "latest"
}

Nós fornecemos um módulo para manipular tudo por nós, apenas precisamos adicioná-lo à modules no nosso ficheiro nuxt.config.js:

js
// nuxt.config.js
export default defineNuxtConfig({
  // ... outras opções
  modules: [
    // ...
    '@pinia/nuxt',
  ],
})

E é isto, usamos a nossa memória conforme o habitual!

Esperando pelas Ações nas Páginas

Tal como acontece com a onServerPrefetch(), podemos chamar uma ação da memória dentro da asyncData(). Dada como useAsyncData() funciona, devemos certificar-nos de retornar um valor. Isto permitirá a Nuxt saltar consecutivamente a ação no lado do cliente e reutilizar o valor a partir do servidor:

vue
<script setup>
const store = useStore()
// nós também poderíamos extrair os dados,
// mas já estão presentes na memória
await useAsyncData('user', () => store.fetchUser())
</script>

Se a nossa ação não resolver o valor, podemos adicionar qualquer valor que não for nulo:

vue
<script setup>
const store = useStore()
await useAsyncData('user', () => store.fetchUser().then(() => true))
</script>

DICA

Se quisermos usar uma memória fora da setup(), lembremos de passar o objeto da pinia à useStore(). Nós o adicionamos ao contexto, assim temos acesso à este na asyncData e na fetch():

js
import { useStore } from '~/stores/myStore'

export default {
  asyncData({ $pinia }) {
    const store = useStore($pinia)
  },
}

Importações Automáticas

Por padrão, a @pinia/nuxt expõe algumas importações automáticas:

  • A usePinia(), que é semelhante à getActivePinia() mas funciona melhor com a Nuxt. Nós podemos adicionar importações automáticas para facilitar a nossa vida
  • A defineStore(), para definir as memórias
  • A storeToRefs() quando precisamos extrair referências individuais a partir duma memória
  • A acceptHMRUpdate() para a substituição de módulo instantânea

Esta também importa automaticamente todas as memórias definidas dentro da nossa pasta stores. Embora esta não procure pelas memórias encaixadas. Nós podemos personalizar este comportamento definindo a opção storesDir:

ts
// nuxt.config.ts
export default defineNuxtConfig({
  // ... outras opções
  modules: ['@pinia/nuxt'],
  pinia: {
    storesDir: ['./stores/**', './custom-folder/stores/**'],
  },
})

Nota que as pastas são relativas à raiz do nosso projeto. Se mudarmos a opção srcDir, precisamos adaptar os caminhos em conformidade.

Nuxt 2 sem a Bridge

A Pinia suporta a Nuxt 2 até a versão 0.2.1 da @pinia/nuxt. Também devemos certificar-nos de instalar a @nuxtjs/composition-api ao lado da pinia:

bash
yarn add pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-api
# ou com o npm
npm install pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-api

Nós fornecemos um módulo para manipular tudo por nós, apenas precisamos adicioná-lo à buildModules no nosso ficheiro nuxt.config.js:

js
// nuxt.config.js
export default {
  // ... outras opções
  buildModules: [
    // Somente na Nuxt 2:
    // https://composition-api.nuxtjs.org/getting-started/setup#quick-start
    '@nuxtjs/composition-api/module',
    '@pinia/nuxt',
  ],
}

TypeScript

Se usarmos a Nuxt 2 (@pinia/nuxt < 0.3.0) com a TypeScript, ou tivermos um jsconfig.json, também devemos adicionar os tipos a context.pinia:

json
{
  "types": [
    // ...
    "@pinia/nuxt"
  ]
}

Isto também garantirá que tenhamos a conclusão de código automática 😉 .

Usando a Pinia ao Lado da Vuex

É recomendado evitar usar ambas Pinia e Vuex mas se precisarmos usar ambas, precisamos dizer a pinia para a não desativar:

js
// nuxt.config.js
export default {
  buildModules: [
    '@nuxtjs/composition-api/module',
    ['@pinia/nuxt', { disableVuex: false }],
  ],
  // ... outras opções
}

Lançada sob a Licença MIT.