BOYYANG/1/blog/红色背景,黑色丝带,舞动的裙摆,穿着性感黑色舞服的动漫美女插画壁纸图

nuxt3中如何使用pinia以及持久化数据

作者: boyyang
分类: 前端开发
发布: 2024-08-14 05:08:19
更新: 2025-03-23 12:33:17
浏览: 486

       在使用nuxt3进行开发时,如果需要用到全局状态管理,那么可以使用pinia对数据进行管理。如何需要持久化也可以使用第三方库对数据进行持久化配置。        

       为什么要使用pinia,使用过vuex状态管理的应该都被其困扰过,特别是同步,异步等等使用起来那是相当的复杂,同时由于vuex的对ts的支持也不是很好,每次都得去看一下里面的字段。在组件中使用也感觉有的复杂,没有pinia这么简单。所以pinia能用的时候就直接放弃了vuex了。

  • 第一步安装pinia
yarn add pinia @pinia/nuxt
# 或者使用 npm
npm install pinia @pinia/nuxt
  • 第二步在nuxt.config.ts中配置
// nuxt.config.ts
export default defineNuxtConfig({
  // ... 其他配置
  modules: [
    // ...
    '@pinia/nuxt',
  ],
})

配置以上2步后其实就可以正常使用pinia相关的功能了,如果需要将数据进行持久化处理,可以安装pinia-plugin-persistedstate 第三方库。

  • 安装pinia-plugin-persistedstate库
yarn add -D @pinia-plugin-persistedstate/nuxt
  • 在plugins文件夹中创建pinia.ts,如果没有plugins文件夹新增就可以,pinia.ts内容如下
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
export default defineNuxtPlugin((nuxtApp: any) => {
    nuxtApp.$pinia.use(piniaPluginPersistedstate)
})

如何使用:

import {defineStore} from 'pinia'
import {useNuxtApp} from '#app'

export interface UserState {
    token: string
    user_info: any
    showUserInfoModal: boolean
    isSignin: boolean
    showSigninModal: boolean
}

const useUserStore = defineStore({
    id: 'app-user',
    state: (): UserState => ({
        token: '',
        user_info: {
            username: 'boyyang',
            motto: '第一行没有你,第二行没有你,第三行没有也罢!',
            avatar: 'BOYYANG/default/avatar.png',
            cover: 'BOYYANG/default/bg.png',
        },
        showUserInfoModal: false,
        isSignin: true,
        showSigninModal: false
    }),
    getters: {
        getToken: (state) => {
            return state.token
        },
    },
    actions: {
        setUserInfo(userInfo: Signinup.UserInfo) {
            this.user_info = userInfo
        },
        setToken(t: string) {
            this.token = t
        },

    },
    //开启持久化
    persist: process.client && {
        key: 'app-user',
        storage: window.localStorage,
        paths: ['token', 'user_info'],
    },
})

const useUserStoreWithOut = () => {
    const {$pinia} = useNuxtApp()
    return useUserStore($pinia)
}

export {
    useUserStore,
    useUserStoreWithOut,
}


#vue3
#nuxt3
#前端
#javascript
#pinia
#typescript