Electron+vue3+pinia多窗口共享/同步状态

先上图看效果

主进程监听自定义修改事件

js 复制代码
ipcMain.on('update-storage', (_, key) => {
  webContents.getAllWebContents().map((webContent) => {//获取所有WebContents实例的数组
    webContent.send('update-storage', key)//经过预加载脚本向渲染进程发送异步带参消息
  })
})

预加载脚本

js 复制代码
import { contextBridge, ipcRenderer } from 'electron'
import { electronAPI } from '@electron-toolkit/preload'

// Custom APIs for renderer
const api = {
  //将事件传递给渲染进程,渲染进程通过window访问
  onUpdateStorage: (callback: (event: Electron.IpcRendererEvent, ...args: any[]) => void) => {
    ipcRenderer.on('update-storage', callback)
  }
}

if (process.contextIsolated) {
  try {
    contextBridge.exposeInMainWorld('electron', electronAPI)
    contextBridge.exposeInMainWorld('api', api)
  } catch (error) {
    console.error(error)
  }
} else {
  // @ts-ignore (define in dts)
  window.electron = electronAPI
  // @ts-ignore (define in dts)
  window.api = api
}

渲染进程

js 复制代码
//pinia存储定义修改方法,所有渲染进程引用同一个store
import { defineStore } from 'pinia'
import { reactive } from 'vue'

export const useUserStore = defineStore('user', () => {
  const userInfo = reactive({
    name: '张三',
    age: 16
  })

  const updateUserInfo = ({ key, value }) => {
    userInfo[key] = value
  }

  return {
    userInfo,
    updateUserInfo
  }
})
html 复制代码
<template>
  <BaseLayout>
    <template #header>
      <Header minimize="testMinimize" maximize="testMaximize" close="testClose"></Header>
    </template>
    <el-alert title="test窗口" type="success" />
    <div>用户姓名:{{ userStore.userInfo.name }}</div>
    <div>用户年龄:{{ userStore.userInfo.age }}</div>
    <el-input v-model="keyName" placeholder=""></el-input>
    <el-button type="primary" @click="updateUserInfo">修改用户姓名</el-button>
  </BaseLayout>
</template>
<script setup lang="ts">
import BaseLayout from '@src/layouts/BaseLayout.vue'
import Header from '@src/layouts/components/Header.vue'
import { useUserStore } from '@src/store/modules'
import { ElMessage } from 'element-plus'
import { ref } from 'vue'

const keyName = ref('')
const userStore = useUserStore()
const updateUserInfo = () => {
  if (keyName.value.trim()) {
    const data = {
      key: 'name',
      value: keyName.value
    }
    //向主进程发送修改事件
    window.electron.ipcRenderer.send('update-storage', JSON.stringify(data))
  }
  keyName.value = ''
}
//所以渲染进程监听修改事件,调用修改方法
window.electron.ipcRenderer.on('update-storage', (_, data) => {
  userStore.updateUserInfo(JSON.parse(data))
  ElMessage.success('pinia数据更新了~')
})
</script>

以上采用的方法并没有存储到localstorage里,还可以先存储到localstorage,通过修改事件,pinia直接拿localstorage里面的数据进行赋值(end)

相关推荐
Dovis(誓平步青云)2 分钟前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan34 分钟前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_1 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒1 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技2 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu2 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
默_笙3 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript
zhangzeyuaaa3 小时前
深入理解 Ruby 运算符:本质、分类、坑点与重载实战
开发语言·前端·ruby
一木 之林3 小时前
DeepSeek Agent 开发(一)
开发语言·前端·javascript
树下水月4 小时前
Typora破解
linux·服务器·前端