Pinia只能存储简单数据类型

最近用vue做了一个管理后台,登录后使用Pinia存储一个User对象,包括name,token,avator。

在接口中统一拦截,header中添加token。获取Pinia里的对象对应的token值时发现是undefined,于是会出现登录后可以正常访问接口,刷新后就没有带上token,接口返回错误。于是又尝试创建一个新的defineStore,直接保存token,发现可以拿到。原来Pinia只能存储简单数据类型。

Pinia数据持久化可以通过使用pinia-plugin-persistedstate插件来实现。‌

Pinia是一个Vue的状态管理库,它允许开发者跨组件或页面共享状态。为了实现数据的持久化,即让数据在页面刷新或重新加载后依然保持,可以使用pinia-plugin-persistedstate插件。这个插件可以将Pinia管理的状态保存到localStorage或sessionStorage中,从而实现在不同会话或浏览器关闭后数据依然可用。

使用pinia-plugin-persistedstate插件进行数据持久化的基本步骤如下:

‌安装插件‌:首先,需要通过npm安装pinia-plugin-persistedstate插件。
‌导入并使用‌:在项目的入口文件(如main.ts或main.js)中导入createPinia和piniaPluginPersistedstate,并创建Pinia实例。
‌挂载插件‌:将创建的Pinia实例挂载到Vue应用上,并使用piniaPluginPersistedstate插件。
‌在Store中使用‌:在定义Store时,将需要持久化的状态设置为可持久化(通过设置persist属性为true)。
通过这些步骤,Pinia管理的状态就会被自动同步到localStorage或sessionStorage中,从而实现数据的持久化存储。这种方式适用于保存简单的数据类型,如数字、字符串等,因为它直接操作的是浏览器的存储API。对于更复杂的数据类型,可能需要额外的序列化和反序列化处理,以确保数据能够正确地存储和恢复‌ 。

### Vue3 使用 Pinia 管理状态存储的最佳实践 在 Vue 3 开发中,Pinia 是一种轻量级的状态管理库,提供了简单而强大的 API 来处理应用中的全局状态。以下是关于如何在 Vue 3 中使用 Pinia 进行状态存储的具体方法。 #### 安装 Pinia 要开始使用 Pinia,在项目根目录下运行以下命令来安装它: ```bash yarn add pinia # 或者使用 npm npm install pinia ``` 完成安装后,需要将其注册到 Vue 实例中[^3]。 --- #### 创建 Store 并定义状态 通过 `defineStore` 函数可以轻松创建一个新的 store。下面是一个简单的例子,展示了如何定义和操作状态。 ```javascript // stores/counter.js import { defineStore } from 'pinia'; export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, // 初始状态 }), getters: { doubleCount: (state) => state.count * 2, // 计算属性 }, actions: { increment() { this.count++; // 修改状态的方法 }, decrement() { this.count--; // 修改状态的方法 }, }, }); ``` 上述代码片段中: - **State**: 表示当前 store 的初始状态。 - **Getters**: 类似于 Vue 组件中的计算属性,用于派生数据。 - **Actions**: 提供修改状态的逻辑,支持异步操作[^1]。 --- #### 在组件中使用 Store 一旦定义好 store 后,可以在任何 Vue 组件中访问并调用它的状态、getters 和 actions。 ```vue <template> <div> <p>Current Count: {{ counter.count }}</p> <p>Double Count: {{ counter.doubleCount }}</p> <button @click="increment">Increment</button> <button @click="decrement">Decrement</button> </div> </template> <script setup> import { useCounterStore } from '@/stores/counter'; const counter = useCounterStore(); function increment() { counter.increment(); } function decrement() { counter.decrement(); } </script> ``` 在这个模板中,我们引入了之前定义好的 `useCounterStore`,并通过解构的方式获取其中的内容。点击按钮会触发对应的 action 方法更新状态[^2]。 --- #### 持久化状态 为了实现状态的持久化(即刷新页面后仍保留上次的数据),可以通过第三方插件如 `pinia-plugin-persistedstate` 达成目标。 ##### 步骤一:安装依赖 ```bash yarn add pinia-plugin-persistedstate # 或者使用 npm npm install pinia-plugin-persistedstate ``` ##### 步骤二:配置插件 ```javascript // main.js import { createApp } from 'vue'; import { createPinia } from 'pinia'; import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; const app = createApp(App); const pinia = createPinia(); // 添加持久化插件 pinia.use(piniaPluginPersistedstate); app.use(pinia).mount('#app'); ``` ##### 步骤三:启用持久化的 Store 只需在 store 配置中加入 `persist: true` 即可开启该功能。 ```javascript // stores/user.js import { defineStore } from 'pinia'; export const useUserStore = defineStore('user', { state: () => ({ name: '', age: null, }), persist: true, // 启用持久化 }); ``` 这样即使浏览器重新加载,用户的姓名和年龄也会保存下来。 --- #### 类型安全的支持 由于 TypeScript 的普及,Pinia 原生支持类型推断,使得开发者能够获得更好的开发体验。例如: ```typescript // stores/cart.ts interface Product { id: number; title: string; price: number; } export const useCartStore = defineStore('cart', { state: (): { items: Product[] } => ({ items: [] }), actions: { addItem(product: Product) { this.items.push(product); }, }, }); ``` 在这里,TypeScript 明确指定了产品的结构,从而减少了潜在错误的发生概率。 --- ### 总结 以上介绍了 Pinia 的基本概念及其最佳实践方式,包括但不限于状态初始化、getter 和 action 的定义、store 的模块化设计以及状态持久化等内容。这些特性共同构成了一个灵活且高效的解决方案,适用于现代前端应用程序的状态管理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值