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
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
:
"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
:
// 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:
<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:
<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()
:
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
:
// 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
:
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
:
// 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
:
{
"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:
// nuxt.config.js
export default {
buildModules: [
'@nuxtjs/composition-api/module',
['@pinia/nuxt', { disableVuex: false }],
],
// ... outras opções
}