当前位置: 首页 > article >正文

【VUE】pinia持久化存储

前言:状态持久化存储的意义在于它能够确保用户在与应用程序交互时,其操作状态、用户偏好、应用数据等关键信息在页面刷新、浏览器关闭或重新启动后依然得以保留,从而提供连贯、无缝的用户体验,避免因状态丢失导致的不便和重复操作。下面我们一起试试吧。

安装安装 Pinia:

pnpm install pinia
# 或者
yarn add pinia

在项目的入口文件(通常是 main.js 或 main.ts)中,创建一个 Pinia 实例,并将其挂载到 Vue 应用程序上:

创建 Pinia 实例:

import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.mount('#app');

定义 Store:

使用 defineStore 方法来创建一个 Store。Store 是用来管理状态的地方:


import { defineStore } from 'pinia';
export const useMyStore = defineStore('myStore', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++;
    },
  },
});

安装并配置持久化插件:

npm install pinia-plugin-persistedstate
# 或者
yarn add pinia-plugin-persistedstate

在 Pinia 实例上注册插件:

import { createPinia } from 'pinia';
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
const pinia = createPinia();
pinia.use(piniaPluginPersistedstate);

在 Store 中启用持久化:

export const useMyStore = defineStore('myStore', {
  state: () => ({
    count: 0,
  }),
  persist: true, // 持久化整个状态
  // 或者
  persist: {
    key: 'my-store',
    storage: localStorage,
    pick: ['count'], // 仅持久化 count 字段
  },
});

当然,我们也可以自己尝试着实现一下

定义持久化存储插件方法

// 定义存储key前缀
const KEY_PREFIX = 'PINIA_STORE_';
import { type PiniaPluginContext } from 'pinia';

/**
 *
 * @param context pinia上下文实例
 */
export default function (context: PiniaPluginContext) {
  const { store } = context;
  const key = KEY_PREFIX + store.$id;
  // 页面卸载(刷新、关闭)前存储
  window.addEventListener('beforeunload', () => {
    localStorage.setItem(key, JSON.stringify(store.$state));
  });
  // 页面加载是取
  store.$patch(JSON.parse(localStorage.getItem(key) || '{}'));
}

挂在到pinia实例上

import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
const app = createApp(App);
const pinia = createPinia();
import persist from '@/stores/persist';
pinia.use(persist);
app.use(pinia);
app.mount('#app');

预览

请添加图片描述

参考

  • 插件文档

http://www.kler.cn/a/300017.html

相关文章:

  • 小哆啦的编程冒险:罗马数字转整数
  • RV1126+FFMPEG推流项目源码
  • windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】
  • 软件测试—— 接口测试(HTTP和HTTPS)
  • 初阶5 排序
  • MyBatis和JPA区别详解
  • python 学习一张图
  • 代码随想录:377. 组合总和 Ⅳ
  • OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用
  • Android Studio下载Gradle失败问题解决
  • C++中string的简单实现
  • 【Hot100】LeetCode—739. 每日温度
  • 【Hot100】LeetCode—322. 零钱兑换
  • 关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)
  • 网络安全(sql注入)
  • DS18B20的C语言驱动
  • 基础算法(2)——滑动窗口
  • 针对中小企业数智化需求,新华三重磅发布 SMB 系列新品
  • 某仿soul欲音社交系统存在任意文件读取漏洞
  • 重修设计模式-结构型-代理模式
  • 音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现
  • flinkcdc 问题记录篇章
  • 只有IP地址没有域名怎么实现HTTPS访问?
  • 【高级编程】Java IO流(补)序列化 反序列化
  • Pyspark下操作dataframe方法(1)
  • eNUM 原理概述(VoNR VoLTE适用) eNUM 报文解析