Pinia持久化失效pinia-plugin-persistedstate

文章讲述了在前端业务层尝试使用持久层store时遇到的问题,指出现有网络资源提供的信息不足。作者提供了错误的代码示例,如import语法,并解释了这些写法为何无效。解决方案是将初始化方法放在一个函数中,并通过自定义函数来设置如登录信息等数据,如`useGlobalStore().setLoginInfo(data.data)`。

肯定能解决,哈哈哈,找了这么多,你这次你找对了文章。

网络上的这个资料都是有问题的,没有讲明白原由。

需求,我想在我前端的业务层里使用 store,但是是持久层store,不过没有生效。

下面是错误的写法,这个写是不生效的。

import { useGlobalStore } from '@/store/modules/global';
import { useMemberStore } from '@/store/modules/member';
import {PiMember} from '@/types/Member'

import pinia from '@/store'
    const memberStore = useMemberStore(pinia);
    const gb = useGlobalStore(pinia);
    gb.token = 'ab123123c'
    memberStore.token = "abc123"
    memberStore.member = {} as PiMember;
    console.log(memberStore);

正确的写法是把这个方法的初始化放到一个函数里,然后自定义一些函数就可以了。

image

image

推荐写法

useGlobalStore().setLoginInfo(data.data)

就是直接拿来用

image

image

<think>我们正在讨论如何在Pinia中使用pinia-plugin-persistedstate插件实现状态持久化。根据提供的引用内容,我们可以总结出以下步骤: 1. **安装插件**:首先需要安装Piniapinia-plugin-persistedstate插件。 2. **全局配置**:在创建Pinia实例时,使用该插件,并可以配置全局的持久化存储选项。 3. **定义Store**:在定义store时,可以设置`persist`选项来启用持久化,也可以自定义存储方式(如使用uni-app的存储API)或覆盖全局配置。 具体步骤: ### 1. 安装 使用npm或yarn安装: ```bash npm install pinia pinia-plugin-persistedstate # 或 yarn add pinia pinia-plugin-persistedstate ``` ### 2. 全局配置(在main.js或main.ts中) 创建一个Pinia实例,并使用持久化插件。如果是在uni-app中,可以自定义存储方式为uni-app的存储API(`uni.getStorageSync`和`uni.setStorageSync`)。在普通Vue项目中,默认使用localStorage。 示例(普通Vue项目): ```javascript import { createApp } from 'vue' import { createPinia } from 'pinia' import { createPersistedState } from 'pinia-plugin-persistedstate' import App from './App.vue' const pinia = createPinia() pinia.use(createPersistedState()) const app = createApp(App) app.use(pinia) app.mount('#app') ``` 示例(uni-app): ```javascript import { createPinia } from 'pinia' import { createPersistedState } from 'pinia-plugin-persistedstate' const pinia = createPinia() // 自定义存储方式为uni-app的存储 pinia.use(createPersistedState({ storage: { getItem: (key) => uni.getStorageSync(key), setItem: (key, value) => uni.setStorageSync(key, value), }, })) export default pinia ``` ### 3. 在Store中启用持久化 在定义store时,通过设置`persist`为`true`来启用持久化(使用全局配置),或者通过一个对象进行更详细的配置。 示例(组合式API): ```javascript import { defineStore } from 'pinia' export const useUserStore = defineStore('user', () => { const count = ref(0) function increment() { count.value++ } return { count, increment } }, { // 启用持久化 persist: true }) ``` 或者使用选项式API: ```javascript import { defineStore } from 'pinia' export const useUserStore = defineStore('user', { state: () => ({ count: 0 }), actions: { increment() { this.count++ } }, persist: true }) ``` ### 4. 自定义持久化配置 可以在store的`persist`选项中覆盖全局配置,例如指定存储的key、使用sessionStorage、只持久化部分状态等。 示例: ```javascript persist: { key: 'my-custom-key', // 自定义key storage: sessionStorage, // 使用sessionStorage paths: ['count'], // 只持久化count状态 } ``` ### 注意事项 - 在uni-app中,由于环境差异,需要自定义存储方法(如使用uni-app的同步存储API)[^2]。 - 如果遇到重载错误(如引用[5]所述),可能是由于插件版本或使用方式不正确,可以尝试安装`pinia-plugin-persistedstate`替代`pinia-plugin-persist`[^5]。 ### 引用说明 上述步骤参考了提供的引用内容,特别是引用[2]和[3]提供了安装和配置的示例,引用[5]提到了可能遇到的问题及解决方案。 §§相关问题§§ 1. 如何在Pinia中只持久化store的部分状态? 2. 在uni-app中使用pinia-plugin-persistedstate需要注意什么? 3. pinia-plugin-persistedstate支持哪些存储方式?</think>### Pinia 使用 pinia-plugin-persistedstate 实现持久化存储指南 #### 1. **安装依赖** 首先安装 Pinia持久化插件: ```bash npm install pinia pinia-plugin-persistedstate # 或 yarn add pinia pinia-plugin-persistedstate ``` [^3] #### 2. **全局配置(main.js/main.ts)** 在入口文件中初始化插件: ```typescript import { createApp } from 'vue' import { createPinia } from 'pinia' import { createPersistedState } from 'pinia-plugin-persistedstate' import App from './App.vue' // 创建 Pinia 实例 const pinia = createPinia() // 使用持久化插件(默认使用 localStorage) pinia.use(createPersistedState()) // 挂载到 Vue 应用 createApp(App).use(pinia).mount('#app') ``` [^3][^5] #### 3. **Store 配置** 在定义 store 时启用持久化: ```typescript import { defineStore } from 'pinia' export const useUserStore = defineStore('user', { state: () => ({ token: '', profile: null }), actions: { setToken(token: string) { this.token = token } }, // 启用持久化 persist: true }) ``` #### 4. **自定义存储方式** ##### a) 使用 sessionStorage ```typescript // store 配置 persist: { storage: sessionStorage } ``` ##### b) 在 uni-app 中使用 ```typescript // 全局配置自定义存储 pinia.use(createPersistedState({ storage: { getItem: (key) => uni.getStorageSync(key), setItem: (key, value) => uni.setStorageSync(key, value) } })) ``` [^2] #### 5. **高级配置** ```typescript persist: { key: 'custom_key', // 自定义存储键名 paths: ['token'], // 仅持久化 token 字段 storage: localStorage, // 指定存储方式 serializer: { // 自定义序列化 serialize: JSON.stringify, deserialize: JSON.parse } } ``` [^4] #### 6. **注意事项** 1. **命名冲突**:不同 store 使用相同 key 会导致数据覆盖 2. **数据类型**:Map/Set 等特殊类型需自定义序列化 3. **存储限制**:localStorage 有 5MB 大小限制 4. **加密需求**:敏感数据建议自行加密后存储 5. **插件冲突**:避免同时使用多个持久化插件[^5] > 当页面刷新时,插件会自动从 storage 恢复状态,确保应用状态持久化[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值