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

electron+vue3全家桶+vite项目搭建【17】pinia状态持久化

文章目录

    • 引入
    • 问题演示
    • 实现效果展示、
    • 实现步骤
      • 1.封装状态初始化函数
      • 2.封装状态更新同步函数
      • 3.完整代码

引入

上一篇文章我们已经实现了electron多窗口中,pinia的状态同步,但你会发现,如果我们在一个窗口里面修改了状态,然后再打开另一个窗口,此时窗口的状态并没有同步,所以我们需要对pinia的状态进行持久化处理,并在页面初始化时取到本地缓存的状态。

demo项目地址

问题演示

如下所示,我们先在一个窗口中自增数值,然后再打开另一个窗口,此时窗口中的数值仍然是初始值,只有我们再次点击增加时,才会同步【因为我们上一节实现了pinia多窗口状态同步】

请添加图片描述

实现效果展示、

请添加图片描述

实现步骤

1.封装状态初始化函数

我们在src\store\plugins\shareStorePlugin.ts中补充初始化函数

  • 当pinia对应的状态对象初始化时,我们将对象的引用传入
  • 从本地缓存中取到序列化的store对象,我们将其反序列化后遍历key、value设置store的状态即可
/*** 初始化状态对象* @param store*/
function initStore(store: any) {const cacheKey = STORE_CACHE_KEY_PREFIX + store.$id;// 从本地缓存中读取store的值const stateJsonStr = cacheUtils.get(cacheKey);if (stateJsonStr) {const stateCache = JSON.parse(stateJsonStr);const keys = Object.keys(stateCache);const values = Object.values(stateCache);/// 更新各个key对应的值的状态for (let i = 0; i < keys.length; i++) {store.$state[keys[i]] = values[i];}}
}

2.封装状态更新同步函数

我们在src\store\plugins\shareStorePlugin.ts中补充状态更新同步逻辑

  • 之前的主动更新逻辑都是累加版本号、设置缓存,通知更新,我们不妨将这段逻辑抽离
  • 将对应的store序列化后存入本地缓存中
/*** 状态更新同步* @param stateJsonStr 序列化的状态修改字符串* @param storeName  修改的状态的名称* @param storeUpdateVersion  状态修改的版本号*/
function updateStoreSync(stateJsonStr: string,storeName: string,storeUpdateVersion: number
) {// 更新本地缓存的store版本号const storeCacheVersionKey = STORE_CACHE_VERSION_KEY_PREFIX + storeName;cacheUtils.set(storeCacheVersionKey, storeUpdateVersion, STORE_CACHE_TIME);// 通知主线程更新ipcRenderer.invoke('pinia-store-change', storeName, stateJsonStr);// 更新本地缓存的storecacheUtils.set(STORE_CACHE_KEY_PREFIX + storeName, stateJsonStr);
}

3.完整代码

我们调整之前的代码,将两个函数嵌入到原来的逻辑之中

src\store\plugins\shareStorePlugin.ts

import { ipcRenderer } from "electron";
import cacheUtils from "@/utils/cacheUtils";
import { PiniaPluginContext } from "pinia";// 预设本地store版本缓存时间为50s  实际开发中可以设置很大,缓存时间的限制,目的是为了让版本归零,避免自增超过上限
const STORE_CACHE_TIME = 50;
// 设置本地store缓存的key
const STORE_CACHE_KEY_PREFIX = "store_";
const STORE_CACHE_VERSION_KEY_PREFIX = STORE_CACHE_KEY_PREFIX + "version_";declare module "pinia" {export interface PiniaCustomProperties {storeUpdateVersion: number; // 标记store变更的版本}
}/**获取本地缓存的store的修改版本 */
function getLocalStoreUpdateVersion(storeCacheKey: string) {let currentStoreUpdateVersion: number = cacheUtils.get(storeCacheKey);// 如果本地没有,就初始化一个if (currentStoreUpdateVersion === null ||currentStoreUpdateVersion === undefined) {currentStoreUpdateVersion = 0;cacheUtils.set(storeCacheKey, currentStoreUpdateVersion, STORE_CACHE_TIME);}return currentStoreUpdateVersion;
}// 处理electron多窗口,pinia共享问题
export function shareStorePlugin({ store }: PiniaPluginContext) {// 初始化本地缓存版本const storeName: string = store.$id;/// 缓存keyconst storeCacheVersionKey = STORE_CACHE_VERSION_KEY_PREFIX + storeName;let currentStoreUpdateVersion: number =getLocalStoreUpdateVersion(storeCacheVersionKey);// 初始化同步store版本store.storeUpdateVersion = currentStoreUpdateVersion;// 初始化storeinitStore(store);// 监听数据变化store.$subscribe(() => {// 获取本地存储的最新状态currentStoreUpdateVersion = cacheUtils.get(storeCacheVersionKey);/// 如果本地缓存过期,则重置一个缓存,并且通知主进程让其他窗口更新状态if (currentStoreUpdateVersion === null ||currentStoreUpdateVersion === undefined) {currentStoreUpdateVersion = 0;store.storeUpdateVersion = currentStoreUpdateVersion;console.log(`主动更新 ${storeName} 的状态`);// 主动更新updateStoreSync(JSON.stringify(store.$state),storeName,store.storeUpdateVersion);} else {// 如果版本一致,则增加版本号,且更新本地存储版本 ,并且通知主线程告知其他窗口同步更新store状态if (store.storeUpdateVersion === currentStoreUpdateVersion) {store.storeUpdateVersion++;console.log(`主动更新 ${storeName} 的状态`);// 主动更新updateStoreSync(JSON.stringify(store.$state),storeName,store.storeUpdateVersion);} else {// 如果当前store的版本大于本地存储的版本,说明本地版本重置了【过期重新创建】,此时重置store的版本// 如果当前store的版本小于本地存储的版本,说明是被动更新引起的state变动回调,此时仅更新版本即可store.storeUpdateVersion = currentStoreUpdateVersion;}}});// 监听数据同步修改ipcRenderer.on("pinia-store-set",(event, targetStoreName: string, jsonStr: string) => {// 监听到状态改变后,同步更新状态if (storeName === targetStoreName) {console.log("被动更新状态:" + storeName);const obj = JSON.parse(jsonStr);const keys = Object.keys(obj);const values = Object.values(obj);/// 更新各个key对应的值的状态for (let i = 0; i < keys.length; i++) {store.$state[keys[i]] = values[i];}}});
}/*** 状态更新同步* @param stateJsonStr 序列化的状态修改字符串* @param storeName  修改的状态的名称* @param storeUpdateVersion  状态修改的版本号*/
function updateStoreSync(stateJsonStr: string,storeName: string,storeUpdateVersion: number
) {// 更新本地缓存的store版本号const storeCacheVersionKey = STORE_CACHE_VERSION_KEY_PREFIX + storeName;cacheUtils.set(storeCacheVersionKey, storeUpdateVersion, STORE_CACHE_TIME);// 通知主线程更新ipcRenderer.invoke("pinia-store-change", storeName, stateJsonStr);// 更新本地缓存的storecacheUtils.set(STORE_CACHE_KEY_PREFIX + storeName, stateJsonStr);
}/*** 初始化状态对象* @param store*/
function initStore(store: any) {const cacheKey = STORE_CACHE_KEY_PREFIX + store.$id;// 从本地缓存中读取store的值const stateJsonStr = cacheUtils.get(cacheKey);if (stateJsonStr) {const stateCache = JSON.parse(stateJsonStr);const keys = Object.keys(stateCache);const values = Object.values(stateCache);/// 更新各个key对应的值的状态for (let i = 0; i < keys.length; i++) {store.$state[keys[i]] = values[i];}}
}

相关文章:

electron+vue3全家桶+vite项目搭建【17】pinia状态持久化

文章目录 引入问题演示实现效果展示、实现步骤1.封装状态初始化函数2.封装状态更新同步函数3.完整代码 引入 上一篇文章我们已经实现了electron多窗口中&#xff0c;pinia的状态同步&#xff0c;但你会发现&#xff0c;如果我们在一个窗口里面修改了状态&#xff0c;然后再打开…...

java基础入门-05-【面向对象进阶(static继承)】

Java基础入门-05-【面向对象进阶&#xff08;static&继承&#xff09;】 13、面向对象进阶&#xff08;static&继承&#xff09;1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的…...

day12 IP协议与ethernet协议

目录 IP包头 IP网的意义 IP数据报的格式 IP数据报分片 以太网包头&#xff08;链路层协议&#xff09; IP包头 IP网的意义 当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互联的各具体的网络异构细节&#xff1b; 如果在这种覆盖…...

蓝牙耳机哪款性价比高?2023蓝牙耳机性价比排行

随着蓝牙耳机的使用愈发频繁&#xff0c;蓝牙耳机产品也越来越多&#xff0c;蓝牙耳机的功能、价格、外观设计等都不尽相同。接下来&#xff0c;我来给大家推荐几款性价比高的蓝牙耳机&#xff0c;感兴趣的朋友一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a…...

关于C语言的一些笔记

文章目录 May4,2023常量问题基本数据类型补码printf的字符格式控制关于异或、异或的理解赋值运算i和i的区别关系运算符 &#xff2d;ay5,2023逻辑运算中‘非’的理解逗号运算运算符的优先级问题三目运算 摘自加工于C技能树 May4,2023 常量问题 //定义常量 const float PI; PI…...

【Python入门知识】NumPy数组迭代及连接

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组迭代 迭代意味着逐一遍历元素&#xff0c;当我们在 numpy 中处理多维数组时&#xff0c; 可以使用 python 的基本 for 循环来完成此操作。 如果我们对 1-D 数组进行迭代&#xff0c;它将逐一遍历每个元素。 实例 迭…...

我们公司的面试,有点不一样!

我们公司的面试&#xff0c;有点不一样&#xff01; 朋友们周末愉快&#xff0c;我是鱼皮。因为我很屑&#xff0c;所以大家也可以叫我屑老板。 自从我发了自己创业的文章和视频后&#xff0c;收到了很多小伙伴们的祝福&#xff0c;真心非常感谢&#xff01; 不得不说&#…...

C++之初识STL—vector

文章目录 STL基本概念使用STL的好处容器vector1.vector容器简介2.vector对象的默认构造函数3.vector对象的带参构造函数4.vector的赋值5.vector的大小6.vector容器的访问方式7.vector的插入 STL基本概念 STL(Standard Template Library,标准模板库)STL 从广义上分为: 容器(con…...

资讯汇总230503

230503 12:21 【放松身心亲近自然 自驾露营成旅游新风尚】今年“五一”假期&#xff0c;我国旅游业的快速恢复催生自驾露营休闲游、短途游、夜游等新型旅游产品提质升级。快速发展的新兴旅游业态&#xff0c;在促进旅游消费、培育绿色健康生活方式等方面发挥了积极作用&#xf…...

C++之编程规范

目录 谷歌C风格指南&#xff1a;https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/ 编码规则&#xff1a; • 开闭原则&#xff1a;软件对扩展是开放的&#xff0c;对修改是关闭的 • 防御式编程&#xff1a;简单的说就是程序不能崩溃 •…...

ChatGPT做PPT方案,10组提示词方案!

今天我们要搞定的PPT内容是&#xff1a; 活动类型&#xff1a;节日活动、会员活动、新品活动分析类型&#xff1a;用户分析、新品立项、项目汇报内容类型&#xff1a;内容规划、品牌策划 用到的工具&#xff1a; mindshow 邀请码 6509097ChatGPT传送门&#xff08;免费使用…...

分布式夺命12连问

分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性&#xff09;、 Availability&#xff08;可用性&#xff09;、Partition tolerance&#xff08;分区容错性&#xff09;这3个基本…...

sourceTree离线环境部署

目录 1、下载sourceTree安装包&#xff0c;打开之后弹出注册界面&#xff08;需要去国外网站注册&#xff09;2、使用技术手段跳过注册步骤3、打开安装包进行安装 注&#xff1a;建议提前安装好git 1、下载sourceTree安装包&#xff0c;打开之后弹出注册界面&#xff08;需要去…...

6.1.1 图:基本概念

一&#xff0c;基本概念 1.基本定义 &#xff08;1&#xff09;图的定义 顶点集不可以是空集&#xff0c;但边集可以是空集。 &#xff08;2&#xff09; 有向图的表示&#xff1a; 圆括号 无向图的表示&#xff1a; 尖括号 简单图、多重图&#xff1a; 简单图&#xff1a;…...

SlickEdit for Windows and Linux crack

SlickEdit for Windows and Linux crack 现在可以在“新建注释”对话框中对颜色进行排序&#xff0c;使调色板中的颜色阵列看起来更符合逻辑。 在拆分或扩展行注释时添加了撤消步骤&#xff0c;这样您只需点击“撤消”一次即可撤消行注释扩展。 已更新VHDL颜色编码&#xff0c;…...

ChatGPT实现stackoverflow 解释

stackoverflow 解释 ChatGPT 公开服务以来&#xff0c;程序员们无疑是最早深入体验和"测试"的一批人。出色的效果也引发了一系列知识产权上的争议。著名的 stackoverflow 网站&#xff0c;就宣布禁止用户使用 ChatGPT 生成的内容来回答问题&#xff0c;一经发现&…...

第五章 作业(123)【编译原理】

第五章 作业【编译原理】 前言推荐第五章 作业123 随堂练习课前热身04-17随堂练习04-17课前热身04-24 最后 前言 2023-5-3 22:12:46 以下内容源自《【编译原理】》 仅供学习交流使用 推荐 第四章 作业&#xff08;123&#xff09;【编译原理】 第五章 作业 1 1.令文法G为…...

基于Vue的个性化网络学习笔记系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…...

如何搭建一个HTTP实验环境

这一讲是“破冰篇”的最后一讲&#xff0c;我会先简单地回顾一下之前的内容&#xff0c;然后在 Windows 系统上实际操作&#xff0c;用几个应用软件搭建出一个“最小化”的 HTTP 实验环境&#xff0c;方便后续的“基础篇”“进阶篇”“安全篇”的学习。 “破冰篇”回顾 HTTP …...

Electron 环境搭建

https://start.spring.io/ 在线数据分析网站 https://tj.aldwx.com/ https://www.spsspro.com/ win10如何分屏 拖到边缘 Electron 环境搭建 https://www.electronjs.org/zh/docs/latest/tutorial/%E6%89%93%E5%8C%85%E6%95%99%E7%A8%8B electron 隐藏菜单 electron 标题栏 设…...

农机电招平台~java

摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变…...

springboot+vue体质测试数据分析及可视化设计(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&a…...

thinkphp+vue+html高校固定资产管理系统维修 租借4h80u

本高校资产管理系统采用的数据库是Mysql&#xff0c;使用thinkphp框架开发。在设计过程中&#xff0c;充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框…...

【学习笔记】「北大集训 2021」经典游戏

我觉得很厉害。要是考场上能把这道题切了的话数据结构的水平肯定是不低的。 考虑简化版问题&#xff1a;如果只询问一个点的答案怎么做。 注意&#xff0c;我这么做是有风险的。我把战线拉长了。不过当然&#xff0c;如果连简化版的问题都做不了&#xff0c;那何谈正解&#…...

优惠卷秒杀功能、全局唯一ID、乐观锁解决超卖问题、悲观锁实现一人一单、集群下锁失效问题

文章目录 1 全局唯一ID的需求分析2 Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 乐观锁解决超卖问题6 悲观锁实现一人一单7 集群环境下的并发问题 1 全局唯一ID的需求分析 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单…...

Nest的基本概念,以及如何使用Nest CLI来构建一个简单的Web应用程序

Nest是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它是基于Express.js构建的&#xff0c;并且提供了多种新特性和抽象层&#xff0c;可以让开发者更加轻松地构建复杂的应用程序。 本文将介绍Nest的基本概念&#xff0c;以及如何使用Nest CLI来构建一个简单的W…...

15个创新世界119座城:1~10章音频

感恩每一个喜欢我文字的朋友&#xff0c;感恩每一次遇见。 最近后台总有朋友留言&#xff0c;能不能每一章配上音频&#xff0c;这样平时开车或挤地铁时也能听听。 谢谢你们在开车和挤地铁的时候都会产生听这本书的冲动。 五一抽空先把前十章的音频转录出来&#xff0c;希望你们…...

AI面试必刷算法题 附答案和解析 --持续更新中

面试中发现很多同学一股脑优化、润色项目经历&#xff0c;但聊到基本的算法&#xff0c;反而会一脸懵X&#xff0c;得空整理下算法题给大家&#xff0c;希望对你有帮助。 1. tail(head(tail(C))) ( ) 已知广义表: A(a,b), B(A,A), C(a,(b,A),B), 求下列运算的结果:&#xff08…...

聊一聊 GDB 调试程序时的几个实用命令

一&#xff1a;背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯&#xff0c;不习惯在于想用的命令或者面板找不到&#xff0c;总的来说还是各有千秋吧&#xff0c;今天我们来聊一下几个在调试中比较实用的命令&#xff1a; 查看内存硬件…...

MySQL驱动对MYSQL进行update操作时返回值注意UseAffectedRows

数据库upate更新表时经常要用&#xff0c;update的结果进行一些逻辑判断&#xff0c;如返回值大于1表示更新成功&#xff0c;为0表示更新失败。 但是使用Mysql驱动连接数据库并进行update操作时&#xff0c;返回值可能不在预期。 update iwrs_drug_order set status2 where …...

梅陇做网站/百度热搜seo

这次写一下精灵创建的几种类型: 一、通过文件创建&#xff1a; 在原有的基础上加入例如以下代码&#xff1a; //一、通过文件创建精灵 CCSprite *bg CCSprite::create("map.png"); CCSize winSize CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸…...

企业网站开发一般多少钱/网站优化排名软件哪些最好

【49】监听器基本概念JavaWeb中的监听器是Servlet规范中定义的一种特殊类&#xff0c;它用于监听web应用程序中的ServletContext&#xff0c;HttpSession和ServletRequest等域对象的创建与销毁事件&#xff0c;以及监听这些域对象中的属性发生修改的事件。Servlet监听器的分类在…...

摄影网站建立/北京seo平台

一.问题 题目描述 小明最近迷上了积木画&#xff0c;有这么两种类型的积木&#xff0c;分别为 I 型&#xff08;大小为 2 个单位面积&#xff09;和 L 型&#xff08;大小为 3 个单位面积&#xff09;&#xff1a; 同时&#xff0c;小明有一块面积大小为 2 N 的画布&#…...

厦门网站建设方案报价/站长工具seo推广秒收录

new words&#xff1a; picnic n. 野餐 vi. 去野餐 过去式 picnicked过去分词 picnicked现在分词 picnicking复数 picnics第三人称单数 picnics bamboo n. 竹&#xff0c;竹子 vt. 为…装上篾条 adj. 竹制的&#xff1b;土著居民的 复数 bamboos On the go Do you wanna…...

wordpress文档/百度如何免费打广告

updateAllColumnById mybatisplus中的updateById和updateAllColumnById—仅做记录 updateAllColumnById方法可以更新带有null的列&#xff0c;与selectOne 相比较使用 而updateById更新时如果带有null&#xff0c;则只更新带有参数值的entity&#xff0c;null的不更新&#…...

昆山广告公司/如何做seo整站优化

摘 要&#xff1a; 多位点序列分型&#xff08;MLST&#xff09;是一种基于核酸序列测定的细菌分型方法&#xff0c;通过PCR扩增多个管家基因内部片段&#xff0c;测定其序列&#xff0c;分析菌株的变异&#xff0c;从而进行分型。MLST被广泛应用于病原菌、环境菌和真核生物中。…...