Nuxt.js
Usar Pinia con Nuxt es más fácil debido a que Nuxt tiene en cuenta muchas cosas cuando hablamos de renderizado del lado del servidor. Por ejemplo, no necesitas preocuparte sobre serialización ni ataques XSS. Pinia soporta Nuxt Bridge y Nuxt 3. Para soporte directo con Nuxt 2, mira más abajo.
Instalación
yarn add pinia @pinia/nuxt
# o con npm
npm install pinia @pinia/nuxtyarn add pinia @pinia/nuxt
# o con npm
npm install pinia @pinia/nuxtTIP
Si estás usando npm puede que te encuentres con el error ERESOLVE unable to resolve dependency tree. En ese caso, añade lo siguiente a tu package.json:
"overrides": {
"vue": "latest"
}"overrides": {
"vue": "latest"
}Proporcionamos un módulo para manejar todo por ti, solo necesitas añadirlo a modules en tu archivo nuxt.config.js:
// nuxt.config.js
export default defineNuxtConfig({
// ... otras opciones
modules: [
// ...
'@pinia/nuxt',
],
})// nuxt.config.js
export default defineNuxtConfig({
// ... otras opciones
modules: [
// ...
'@pinia/nuxt',
],
})Y eso es todo, ¡usa tu almacén como siempre!
Usar el almacén fuera de setup()
Si quieres usar un almacén fuera de setup(), recuerda pasar el objeto de pinia a useStore(). Lo hemos añadido al contexto para que tengas acceso a el en asyncData() y fetch():
import { useStore } from '~/stores/myStore'
export default {
asyncData({ $pinia }) {
const store = useStore($pinia)
},
}import { useStore } from '~/stores/myStore'
export default {
asyncData({ $pinia }) {
const store = useStore($pinia)
},
}Como con onServerPrefetch(), no necesitas hacer nada especial si quieres llamar a una acción de un almacén en asyncData():
<script setup>
const store = useStore()
const { data } = await useAsyncData('user', () => store.fetchUser())
</script><script setup>
const store = useStore()
const { data } = await useAsyncData('user', () => store.fetchUser())
</script>Importaciones automáticas
Por defecto @pinia/nuxt expone una sola importación automática: usePinia(), que es similar a getActivePinia() pero funciona mejor con Nuxt. Puedes añadir importaciones automáticas para facilitarte la vida:
// nuxt.config.js
export default defineNuxtConfig({
// ... otras opciones
modules: [
// ...
[
'@pinia/nuxt',
{
autoImports: [
// importa automáticamente `defineStore`
'defineStore', // import { defineStore } from 'pinia'
['defineStore', 'definePiniaStore'], // import { defineStore as definePiniaStore } from 'pinia'
],
},
],
],
})// nuxt.config.js
export default defineNuxtConfig({
// ... otras opciones
modules: [
// ...
[
'@pinia/nuxt',
{
autoImports: [
// importa automáticamente `defineStore`
'defineStore', // import { defineStore } from 'pinia'
['defineStore', 'definePiniaStore'], // import { defineStore as definePiniaStore } from 'pinia'
],
},
],
],
})Nuxt 2 sin bridge
Pinia soporta Nuxt 2 hasta @pinia/nuxt v0.2.1. Asegúrate de instalar también @nuxtjs/composition-api junto con pinia:
yarn add pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-api
# o con npm
npm install pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-apiyarn add pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-api
# o con npm
npm install pinia @pinia/nuxt@0.2.1 @nuxtjs/composition-apiSuministramos un módulo para manejar todo por ti, solo necesitas añadirlo a buildModules en tu archivo nuxt.config.js:
// nuxt.config.js
export default {
// ... otras opciones
buildModules: [
// solo Nuxt 2:
// https://composition-api.nuxtjs.org/getting-started/setup#quick-start
'@nuxtjs/composition-api/module',
'@pinia/nuxt',
],
}// nuxt.config.js
export default {
// ... otras opciones
buildModules: [
// solo Nuxt 2:
// https://composition-api.nuxtjs.org/getting-started/setup#quick-start
'@nuxtjs/composition-api/module',
'@pinia/nuxt',
],
}TypeScript
Si estás usando Nuxt 2 (@pinia/nuxt < 0.3.0) con TypeScript o tienes un jsconfig.json, deberás añadir también los tipos para context.pinia:
{
"types": [
// ...
"@pinia/nuxt"
]
}{
"types": [
// ...
"@pinia/nuxt"
]
}Esto también asegurará que tengas autocompletado 😉 .
Usar Pinia junto con Vuex
Es recomendable evitar usar Pinia y Vuex a la vez, pero si necesitas usar ambos tendrás que decirle a pinia que no lo deshabilite:
// nuxt.config.js
export default {
buildModules: [
'@nuxtjs/composition-api/module',
['@pinia/nuxt', { disableVuex: false }],
],
// ... otras opciones
}// nuxt.config.js
export default {
buildModules: [
'@nuxtjs/composition-api/module',
['@pinia/nuxt', { disableVuex: false }],
],
// ... otras opciones
}