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

上海专业网站建设平台网站建设与维护模板

上海专业网站建设平台,网站建设与维护模板,推荐几个没封的正能量网站,小企业网站建设哪家便宜文章目录 引入问题演示实现效果展示、实现步骤1.封装状态初始化函数2.封装状态更新同步函数3.完整代码 引入 上一篇文章我们已经实现了electron多窗口中#xff0c;pinia的状态同步#xff0c;但你会发现#xff0c;如果我们在一个窗口里面修改了状态#xff0c;然后再打开… 文章目录 引入问题演示实现效果展示、实现步骤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];}} }
http://www.w-s-a.com/news/352324/

相关文章:

  • 监理工程师证查询网站百度关键词优化软件网站
  • 关于建筑建设的网站asp网站建设报告书
  • 服务二级公司网站建设平台销售模式有哪些
  • 南昌县建设局网站微信分销小程序开发
  • 网站设计师需要什么知识与技能wordpress个性
  • 做茶叶网站的目的和规划有什么做照片书的网站
  • 开福区城乡建设局门户网站关键词挖掘查询工具爱站网
  • 网站建设全国排名沈阳seo按天计费
  • 成都公司网站设计无锡seo网站推广费用
  • 建网站平台要多少钱购物网站界面设计策划
  • 学完js了可以做哪些网站长沙建站官网
  • 怎么样做问卷网站多少钱英语
  • 房产网站建设方案建筑公司是干什么的
  • wordpress建的大型网站柳州市网站建设
  • 石家庄做网站的公司有哪些微信自媒体网站建设
  • 池州哪里有做网站注册公司有哪些风险
  • 做古代风格头像的网站对网站政务建设的建议
  • 网站搜索栏怎么做设计个网站要多少钱
  • 阿里巴巴网站建设目标wamp wordpress
  • 自己做的网站怎么挂网上金蝶erp
  • 网站的页面由什么组成淘宝网网站建设的需求分析
  • 软文网站推广法dede5.7内核qq个性门户网站源码
  • 个人备案网站名称校园网站建设特色
  • vr超市门户网站建设班级网站怎么做ppt模板
  • 网站建设一般是用哪个软件刚开始做写手上什么网站
  • 用jsp做的网站源代码下载有哪些做红色旅游景点的网站
  • 网站开发的技术选型黄石市网站建设
  • 做直播网站需要证书吗专做宝宝的用品网站
  • 网站标题用什么符号网站制作交易流程
  • dede模板网站教程jsp网站搭建