How to setup Pinia in Nuxt 3
insidewebdev
Last updated:
Table of Contents
Set up
npm i @pinia/nuxt pinia
Add Pinia to your nuxt.config file
nuxt.config.ts
export default defineNuxtConfig({
buildModules: ['@pinia/nuxt'],
})
Create a store module
Create a folder called stores
and then add your store there , in this case auth.ts
:
stores/auth.ts
import { defineStore } from 'pinia'
export const useAuthStore = defineStore('auth', {
state: () => ({
user: null,
}),
getters: {
isLoggedIn: (state) => !!state.user
},
actions: {
async initAuth() {
let user = this.user
if (!user) {
const response = await $fetch('/api/user')
user = response.user
}
this.updateUser(user)
},
async login (payload) {
// some login logic
},
async register (payload) {
// some register logic
},
async logOut() {
this.updateUser(null)
},
updateUser(payload) {
this.user = payload
}
},
})
This is how a basic store that handles the authentication would like.
Use the module.
Now let's use the newly created store module in our vue component
<template>
<div>{{ isLoggedIn }}</div>
</template>
<script setup>
import { useAuthStore } from "~~/stores/auth";
const authStore = useAuthStore();
// Accessing getters and state
const { user, isLoggedIn } = storeToRefs(authStore);
await authStore.initAuth();
</script>
Conclusion
It's super easy to install and use Pinia in Nuxt 3.
Pinia is the next generation of store management for Vue, and I personally use it over Vuex