electron+vue3全家桶+vite项目搭建【16.1】electron多窗口,pinia状态同步,扩展store方法,主动同步pinia的状态【推荐】

本文介绍了一种改进的Pinia状态同步方法,通过在Pinia插件中扩展actions,让业务逻辑主动触发状态更新,仅同步必要的窗口,避免了全量更新带来的性能问题。同时,主进程负责监听并处理不同窗口之间的状态同步请求。

引入

demo项目地址

我们之前写了一个自动同步pinia状态的插件,可以参考如下文章

electron+vue3全家桶+vite项目搭建【16】electron多窗口,pinia状态无法同步更新问题解决

这里面有一个较大的弊端,就是pinia中的store,只要其中的某个属性修改,就会触发这个store的全量更新,当我们有一些状态频繁更新的时候,就会影响性能,并且有些窗口中的store其实是不需要同步的,但我们无法进行精准的控制,而且为了保证多个窗口间的同步一致,我们做了很多兜底处理。

现在提供另一个思路,我们不被动的自动更新同步store的状态,而是通过扩展store的actions方法,让业务主动调用方法时来主动通知其他窗口完成同步。

实现效果如下

可以看到,只有当我主动触发同步方法时,才会进行窗口间的状态同步

请添加图片描述

实现步骤

1.自定义pinia插件

自定义pinia插件,扩展store,扩展一个stateSync方法

  • 我们先声明一个stateSync方法,然后在store初始化的时候重写该方法

  • src\store\plugins\shareStoreByActionPlugin.ts

import {
   
    ipcRenderer } from "electron";
import cacheUtils from "@/utils/cacheUtils";
import {
   
    PiniaPluginContext } from "pinia";

// 设置本地store缓存的key
const STORE_CACHE_KEY_PREFIX = "store_";

declare module "pinia" {
   
   
  export interface PiniaCustomProperties {
   
   
    // 通知主进程让所有窗口同步pinia的状态
    stateSync(): void;
  }
}

// 处理electron多窗口,pinia共享问题
export function shareStorePlugin({
   
    store }: PiniaPluginContext) {
   
   
  // 初始化本地缓存版本
  const storeName: string = store.$id;
  // 初始化store
  initStore(store);
  // 重写状态同步方法
  store.stateSync = () => {
   
   
    updateStoreSync(stringify(store.$state), storeName);
  };

  // 监听数据同步修改
  ipcRenderer.on(
    "pinia-store-set",
    (event, targetStoreName: string, jsonStr: string) => {
   
   
 
使用electronvue3piniavite进行多窗口主进程封装时,可按以下步骤操作: ### 1. 配置pinia插件 在pinia的初始化中使用插件。在`src\store\index.ts`文件中添加如下代码: ```typescript import { createPinia } from "pinia"; import { shareStorePlugin } from "./plugins/shareStoreByActionPlugin"; const pinia = createPinia(); // 添加状态共享插件 pinia.use(shareStorePlugin); export default pinia; ``` 此步骤引入了`createPinia`来创建pinia实例,并使用自定义的`shareStorePlugin`插件,以实现多窗口的状态共享[^2]。 ### 2. 主进程补充同步处理 在`electron\main\index.ts`主进程文件中添加pinia监听,遍历通知窗口进行pinia的更新,代码如下: ```typescript ipcMain.handle( "pinia-store-change", (event, storeName: string, jsonStr: string) => { // 遍历window执行 for (const currentWin of BrowserWindow.getAllWindows()) { const webContentsId = currentWin.webContents.id; if (webContentsId !== event.sender.id && !currentWin.isDestroyed()) { currentWin.webContents.send( "pinia-store-set", storeName, jsonStr ); } } } ); ``` 当主进程接收到`pinia-store-change`事件时,会遍历所有窗口,将状态变化信息发送给除发送者之外的其他窗口,实现多窗口pinia状态同步更新[^2]。 ### 3. 原理说明 piniavue3官方支持的全局状态管理工具,但在electron多窗口环境下,由于每个窗口相当于一个独立的浏览器实例,状态无法自动同步。因此,通过编写pinia插件结合ipc通信,可实现多窗口同步更新pinia的状态[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值