在 Pinia 中如何实现状态持久化?

简介: 在 Pinia 中如何实现状态持久化?

在 Pinia 中实现状态持久化可以借助第三方插件 pinia-plugin-persistedstate,它能帮助我们将 Pinia store 中的状态保存到本地存储(如 localStoragesessionStorage)或其他存储介质中,在页面刷新或重新打开应用时恢复状态。以下是详细的实现步骤:

1. 安装插件

首先,你需要使用 npm 或者 yarn 来安装 pinia-plugin-persistedstate 插件。

使用 npm 安装

npm install pinia-plugin-persistedstate

使用 yarn 安装

yarn add pinia-plugin-persistedstate

2. 配置插件

在项目中引入并使用该插件,通常在创建 Pinia 实例的文件中进行配置,示例如下:

// store/index.js 或 store/index.ts
import {
    createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';

const pinia = createPinia();
// 使用插件
pinia.use(piniaPluginPersistedstate);

export default pinia;

3. 在 Store 中启用持久化

在定义具体的 store 时,通过 persist 选项来启用状态持久化功能。可以根据需求设置不同的持久化配置,以下是几种常见的配置方式:

3.1 基本配置

// store/counter.js 或 store/counter.ts
import {
    defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
   
    state: () => ({
   
        count: 0
    }),
    actions: {
   
        increment() {
   
            this.count++;
        }
    },
    // 启用持久化
    persist: true
});

在上述示例中,将 persist 设置为 true,表示启用默认的持久化配置,即使用 localStorage 存储状态,存储的键名默认为 store 的 id(这里是 counter)。

3.2 自定义存储介质

可以通过 storage 选项指定使用 sessionStorage 或其他存储方式。

// store/counter.js 或 store/counter.ts
import {
    defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
   
    state: () => ({
   
        count: 0
    }),
    actions: {
   
        increment() {
   
            this.count++;
        }
    },
    persist: {
   
        storage: sessionStorage
    }
});

这里将 storage 设置为 sessionStorage,表示使用会话存储来保存状态。

3.3 自定义存储键名

通过 key 选项可以自定义存储在本地的键名。

// store/counter.js 或 store/counter.ts
import {
    defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
   
    state: () => ({
   
        count: 0
    }),
    actions: {
   
        increment() {
   
            this.count++;
        }
    },
    persist: {
   
        key: 'my-custom-counter-key',
        storage: localStorage
    }
});

在这个例子中,状态将以 my-custom-counter-key 为键名存储在 localStorage 中。

3.4 部分状态持久化

如果只需要对 store 中的部分状态进行持久化,可以使用 paths 选项指定要持久化的状态路径。

// store/user.js 或 store/user.ts
import {
    defineStore } from 'pinia';

export const useUserStore = defineStore('user', {
   
    state: () => ({
   
        name: 'John',
        age: 30,
        tempData: 'temporary'
    }),
    actions: {
   
        updateName(newName) {
   
            this.name = newName;
        }
    },
    persist: {
   
        paths: ['name', 'age']
    }
});

这里只有 nameage 状态会被持久化,tempData 状态不会保存到本地。

4. 在组件中使用持久化的 Store

在组件中引入并使用定义好的 store,状态会在页面刷新或重新打开应用时自动恢复。

<template>
  <div>
    <p>Count: {
  { counterStore.count }}</p>
    <button @click="counterStore.increment">Increment</button>
  </div>
</template>

<script setup>
import { useCounterStore } from '../store/counter';

const counterStore = useCounterStore();
</script>

通过以上步骤,你就可以在 Pinia 中实现状态持久化,确保应用的重要状态在不同会话之间得以保留。

相关文章
|
存储
(pinia-plugin-persistedstate)pinia 持久化存储
(pinia-plugin-persistedstate)pinia 持久化存储
1430 1
|
设计模式 敏捷开发 JavaScript
开箱即用的中后台管理模版,建议收藏!
开箱即用的中后台管理模版,建议收藏!
773 0
|
JavaScript
vue3-在自定义hooks使用useRouter 报错问题
vue3-在自定义hooks使用useRouter 报错问题
2448 0
|
存储 资源调度 JavaScript
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)
Vue3如何使用Pinia详细介绍、pinia持久化存储(pinia-plugin-persistedstate详细配置)
|
资源调度 JavaScript
Pinia的数据持久化
Pinia的数据持久化
|
12月前
|
前端开发 测试技术 API
我同学不知道UnoCSS是什么,我教他用之后效率直接倍增
原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。可以将原子化的 CSS 框架理解为这类 CSS 的统称
1531 5
|
API
Pinia 实用教程【Vue3 状态管理】状态持久化 pinia-plugin-persistedstate,异步Action,storeToRefs(),修改State的 $patch,$reset
Pinia 实用教程【Vue3 状态管理】状态持久化 pinia-plugin-persistedstate,异步Action,storeToRefs(),修改State的 $patch,$reset
4088 1
|
前端开发 JavaScript 安全
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
1930 4
|
JavaScript IDE 开发工具
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
这篇文章介绍了在Vue 3 + TypeScript + Vite开发环境中解决找不到`.vue`文件模块或其类型声明错误的两种方法:使用VSCode的TypeScript Vue Plugin (Volar)插件或手动在`env.d.ts`文件中声明`*.vue`模块类型。
2797 1
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
|
数据可视化 JavaScript
Vue3项目使用G6可视化组件实现一个树形机构图
在Vue 3项目中使用G6可视化组件库实现树形机构图的构建和展示。
3430 1
Vue3项目使用G6可视化组件实现一个树形机构图