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

【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.lryc.cn/news/439470.html

相关文章:

  • 【Java基础】泛型
  • STL-vector练习题
  • Leetcode 165. 比较版本号(Medium)
  • Android 12 Launcher3 去掉Hotseat
  • Nginx实用篇:实现负载均衡、限流与动静分离
  • python | Python中的类多态:方法重写和动态绑定
  • Rust编写Windows服务
  • MATLAB 从 R2024B 开始支持树莓派 5
  • MiniBlogum项目简介
  • 如何用 OBProxy 实现 OceanBase 的最佳路由策略
  • new/delete和malloc/free到底有什么区别
  • Flutter启动无法运行热重载
  • CSS调整背景
  • FinalShell连接Linux服务器并解决反复输入密码问题
  • 实用类工具!分享6款AI论文一键生成器免费8000字
  • vue使用TreeSelect设置带所有父级节点的回显
  • 智能机巢+无人机:自动化巡检技术详解
  • 摩托车加装车载手机充电usb方案/雅马哈USB充电方案开发
  • 进阶岛 任务3: LMDeploy 量化部署进阶实践
  • vue 使用jszip,file-saver下载压缩包,自定义文件夹名,文件名打包下载为zip压缩包文件,全局封装公共方法使用。
  • 计网八股文
  • [001-03-007].第07节:Redis中的事务
  • WLAN实验简述
  • Docker简介在Centos和Ubuntu环境下安装Docker
  • C:字符串函数(续)-学习笔记
  • Depth靶机详解
  • go get -u @latest没有更新依赖模块
  • 介绍一些免费 的 html 5模版网站 和配色 网站
  • 【C++】入门基础(下)
  • Spring Boot 集成 MongoDB - 入门指南