国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

electron+vue3全家桶+vite項(xiàng)目搭建【16.1】electron多窗口,pinia狀態(tài)同步,擴(kuò)展store方法,主動(dòng)同步pinia的狀態(tài)【推薦】

這篇具有很好參考價(jià)值的文章主要介紹了electron+vue3全家桶+vite項(xiàng)目搭建【16.1】electron多窗口,pinia狀態(tài)同步,擴(kuò)展store方法,主動(dòng)同步pinia的狀態(tài)【推薦】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

引入

demo項(xiàng)目地址

我們之前寫(xiě)了一個(gè)自動(dòng)同步pinia狀態(tài)的插件,可以參考如下文章

electron+vue3全家桶+vite項(xiàng)目搭建【16】electron多窗口,pinia狀態(tài)無(wú)法同步更新問(wèn)題解決

這里面有一個(gè)較大的弊端,就是pinia中的store,只要其中的某個(gè)屬性修改,就會(huì)觸發(fā)這個(gè)store的全量更新,當(dāng)我們有一些狀態(tài)頻繁更新的時(shí)候,就會(huì)影響性能,并且有些窗口中的store其實(shí)是不需要同步的,但我們無(wú)法進(jìn)行精準(zhǔn)的控制,而且為了保證多個(gè)窗口間的同步一致,我們做了很多兜底處理。

現(xiàn)在提供另一個(gè)思路,我們不被動(dòng)的自動(dòng)更新同步store的狀態(tài),而是通過(guò)擴(kuò)展store的actions方法,讓業(yè)務(wù)主動(dòng)調(diào)用方法時(shí)來(lái)主動(dòng)通知其他窗口完成同步。

實(shí)現(xiàn)效果如下

可以看到,只有當(dāng)我主動(dòng)觸發(fā)同步方法時(shí),才會(huì)進(jìn)行窗口間的狀態(tài)同步

electron+vue3全家桶+vite項(xiàng)目搭建【16.1】electron多窗口,pinia狀態(tài)同步,擴(kuò)展store方法,主動(dòng)同步pinia的狀態(tài)【推薦】,electron+vue3全家桶,electron,javascript,前端,pinia,vue3全家桶

實(shí)現(xiàn)步驟

1.自定義pinia插件

自定義pinia插件,擴(kuò)展store,擴(kuò)展一個(gè)stateSync方法

  • 我們先聲明一個(gè)stateSync方法,然后在store初始化的時(shí)候重寫(xiě)該方法

  • src\store\plugins\shareStoreByActionPlugin.ts

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

// 設(shè)置本地store緩存的key
const STORE_CACHE_KEY_PREFIX = "store_";

declare module "pinia" {
  export interface PiniaCustomProperties {
    // 通知主進(jìn)程讓所有窗口同步pinia的狀態(tài)
    stateSync(): void;
  }
}

// 處理electron多窗口,pinia共享問(wèn)題
export function shareStorePlugin({ store }: PiniaPluginContext) {
  // 初始化本地緩存版本
  const storeName: string = store.$id;
  // 初始化store
  initStore(store);
  // 重寫(xiě)狀態(tài)同步方法
  store.stateSync = () => {
    updateStoreSync(stringify(store.$state), storeName);
  };

  // 監(jiān)聽(tīng)數(shù)據(jù)同步修改
  ipcRenderer.on(
    "pinia-store-set",
    (event, targetStoreName: string, jsonStr: string) => {
      console.log("被動(dòng)更新哦");
      // 監(jiān)聽(tīng)到狀態(tài)改變后,同步更新?tīng)顟B(tài)
      if (storeName === targetStoreName) {
        // 補(bǔ)充版本號(hào)是否重置標(biāo)識(shí)
        console.log("被動(dòng)更新?tīng)顟B(tài):" + storeName);

        const obj = JSON.parse(jsonStr);
        const keys = Object.keys(obj);
        const values = Object.values(obj);
        /// 更新各個(gè)key對(duì)應(yīng)的值的狀態(tài)
        for (let i = 0; i < keys.length; i++) {
          changeState(store.$state, keys[i], values[i]);
        }
      }
    }
  );
}

/**
 * 狀態(tài)更新同步
 * @param stateJsonStr 序列化的狀態(tài)修改字符串
 * @param storeName  修改的狀態(tài)的名稱
 */
function updateStoreSync(stateJsonStr: string, storeName: string) {
  // 通知主線程更新
  ipcRenderer.invoke("pinia-store-change", storeName, stateJsonStr);

  // 更新本地緩存的store
  cacheUtils.set(STORE_CACHE_KEY_PREFIX + storeName, stateJsonStr);
}

/**
 * 修改state的值
 * 補(bǔ)充 如果反序列化的字段是map類(lèi)型,需要額外處理
 */
function changeState(state: any, key: any, value: any) {
  if (state[key] instanceof Map) {
    if (value instanceof Array) {
      state[key] = new Map(value);
    } else {
      state[key] = new Map(Object.entries(value as object));
    }
  } else {
    state[key] = value;
  }
}

/**
 * 初始化狀態(tài)對(duì)象
 * @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);

    /// 更新各個(gè)key對(duì)應(yīng)的值的狀態(tài)
    for (let i = 0; i < keys.length; i++) {
      changeState(store.$state, keys[i], values[i]);
    }
  }
}

/**
 * 2023/07/03 自定義序列化方式, 處理ts中map類(lèi)型/對(duì)象序列化后為 {} 的情況
 */
function stringify(obj: any): string {
  return JSON.stringify(cloneToObject(obj));
}

// 將字段包含map的對(duì)象轉(zhuǎn)為json對(duì)象的格式
function cloneToObject(obj: any): any {
  let newObj: any = obj;
  if (obj instanceof Map) {
    return Object.fromEntries(obj);
  }
  if (obj instanceof Object) {
    newObj = {};
    const keys = Object.keys(obj);
    const values = Object.values(obj);
    for (let i = 0; i < keys.length; i++) {
      const key = keys[i];
      const value = values[i];
      newObj[key] = cloneToObject(value);
    }
  }
  if (obj instanceof Array) {
    newObj = [];
    for (let i = 0; i < obj.length; i++) {
      newObj[i] = cloneToObject(obj[i]);
    }
  }
  return newObj;
}

然后我們主動(dòng)在pinia的初始化中使用插件文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-678190.html

  • src\store\index.ts
import { createPinia } from "pinia";
// import { shareStorePlugin } from "./plugins/shareStorePlugin";
import { shareStorePlugin } from "./plugins/shareStoreByActionPlugin";

const pinia = createPinia();

// 添加狀態(tài)共享插件
pinia.use(shareStorePlugin);

export default pinia;

2.主進(jìn)程補(bǔ)充同步處理

  • electron\main\index.ts
  • 主進(jìn)程中添加pinia監(jiān)聽(tīng),遍歷通知窗口進(jìn)行pinia的更新
/**pinia多窗口共享 */
ipcMain.handle(
  "pinia-store-change",
  (
    event,
    storeName: string,
    jsonStr: string,
  ) => {
    // 遍歷window執(zhí)行
    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
        );
      }
    }
  }
);

到了這里,關(guān)于electron+vue3全家桶+vite項(xiàng)目搭建【16.1】electron多窗口,pinia狀態(tài)同步,擴(kuò)展store方法,主動(dòng)同步pinia的狀態(tài)【推薦】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • electron+vue3全家桶+vite項(xiàng)目搭建【13.1】ipc通信的使用,主進(jìn)程與渲染進(jìn)程之間的交互

    electron+vue3全家桶+vite項(xiàng)目搭建【13.1】ipc通信的使用,主進(jìn)程與渲染進(jìn)程之間的交互

    electron項(xiàng)目常常由一個(gè)主進(jìn)程和多個(gè)渲染進(jìn)程構(gòu)成,渲染進(jìn)程之間是隔離的,而所有渲染進(jìn)程都和主進(jìn)程共享資源。 所有的渲染進(jìn)程都是由主進(jìn)程創(chuàng)建的 每個(gè)窗口都對(duì)應(yīng)著一個(gè)渲染進(jìn)程 所有的渲染進(jìn)程共享一個(gè)主進(jìn)程 我們主進(jìn)程與渲染進(jìn)程交互,渲染進(jìn)程與渲染進(jìn)程交互【

    2024年02月10日
    瀏覽(118)
  • 基于electron25+vite4創(chuàng)建多窗口|vue3+electron25新開(kāi)模態(tài)窗體

    基于electron25+vite4創(chuàng)建多窗口|vue3+electron25新開(kāi)模態(tài)窗體

    在寫(xiě)這篇文章的時(shí)候,查看了下electron最新穩(wěn)定版本由幾天前24.4.0升級(jí)到了25了,不得不說(shuō)electron團(tuán)隊(duì)迭代速度之快! 前幾天有分享一篇electron24整合vite4全家桶技術(shù)構(gòu)建桌面端vue3應(yīng)用示例程序。 https://www.cnblogs.com/xiaoyan2017/p/17436076.html 這次繼續(xù)接著上次項(xiàng)目,主要介紹electron

    2024年02月06日
    瀏覽(20)
  • 基于Electron24+Vite4+Vue3搭建桌面端應(yīng)用

    基于Electron24+Vite4+Vue3搭建桌面端應(yīng)用

    一說(shuō)到創(chuàng)建桌面應(yīng)用,就不得不提及Electron和Tauri框架。這次給大家主要分享的是基于electron最新版本整合vite4.x構(gòu)建vue3桌面端應(yīng)用程序。 之前也有使用vite2+vue3+electronc創(chuàng)建桌面端項(xiàng)目,不過(guò)? vue-cli-plugin-electron-builder ?腳手架插件構(gòu)建的項(xiàng)目electron版本只有13.x。如今electron版本

    2024年02月06日
    瀏覽(46)
  • 現(xiàn)有的vue3+ts+vite項(xiàng)目集成electron

    現(xiàn)有的vue3+ts+vite項(xiàng)目集成electron

    Electron是使用JavaScript,HTML和CSS構(gòu)建跨平臺(tái)的桌面應(yīng)用程序框架。 Electron兼容Mac、Windows和Linux,可以構(gòu)建出三個(gè)平臺(tái)的應(yīng)用程序。 安裝依賴 原來(lái)有一個(gè)vue3+ts+vite+pnpm的項(xiàng)目,其中sub-modules是子項(xiàng)目,web是主入口項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下: 需要將其轉(zhuǎn)換成Electron項(xiàng)目,只需要在原來(lái)

    2024年02月12日
    瀏覽(99)
  • 快速搭建Electron+Vite3+Vue3+TypeScript5腳手架 (無(wú)需梯子,快速安裝Electron)

    快速搭建Electron+Vite3+Vue3+TypeScript5腳手架 (無(wú)需梯子,快速安裝Electron)

    Electron是一個(gè)使用 JavaScript、HTML 和 CSS 構(gòu)建桌面應(yīng)用程序的框架。 嵌入?Chromium?和?Node.js?到 二進(jìn)制的 Electron 允許您保持一個(gè) JavaScript 代碼代碼庫(kù)并創(chuàng)建 在Windows上運(yùn)行的跨平臺(tái)應(yīng)用 macOS和Linux——不需要本地開(kāi)發(fā)經(jīng)驗(yàn)(這段話是來(lái)自官網(wǎng))。 根據(jù)vite官網(wǎng)文檔 項(xiàng)目創(chuàng)建完成后進(jìn)

    2024年02月02日
    瀏覽(109)
  • 使用vue3+vite+elctron構(gòu)建小項(xiàng)目介紹Electron進(jìn)程間通信

    使用vue3+vite+elctron構(gòu)建小項(xiàng)目介紹Electron進(jìn)程間通信

    進(jìn)程間通信 (IPC) 是在 Electron 中構(gòu)建功能豐富的桌面應(yīng)用程序的關(guān)鍵部分之一。 由于主進(jìn)程和渲染器進(jìn)程在 Electron 的進(jìn)程模型具有不同的職責(zé),因此 IPC 是執(zhí)行許多常見(jiàn)任務(wù)的唯一方法,例如從 UI 調(diào)用原生 API 或從原生菜單觸發(fā) Web 內(nèi)容的更改。 在 Electron 中,進(jìn)程使用 ipcM

    2024年02月06日
    瀏覽(97)
  • vite+ vue3(現(xiàn)有項(xiàng)目或者新項(xiàng)目)+electron打包教程,以及electron代碼熱重載頁(yè)面(保姆級(jí)教程),一文帶你走完全過(guò)程

    vite+ vue3(現(xiàn)有項(xiàng)目或者新項(xiàng)目)+electron打包教程,以及electron代碼熱重載頁(yè)面(保姆級(jí)教程),一文帶你走完全過(guò)程

    ? 1.刪掉type這個(gè)字段,不然會(huì)報(bào)錯(cuò) ?2.然后加上\\\"main\\\": \\\"electron/main.js\\\", ?3.在scripts字段中加入啟動(dòng)electron的命令:如下圖 5.這時(shí)候你去打開(kāi)控制臺(tái)輸入輸入npm run start會(huì)得到一片空白,展示如下頁(yè)面 1.因?yàn)楝F(xiàn)在監(jiān)聽(tīng)的是vue打包后的dist文件夾中的index.html 2.我就不教你們?cè)趺创蜷_(kāi)那個(gè)

    2024年02月11日
    瀏覽(650)
  • vite搭建vue3項(xiàng)目

    vite搭建vue3項(xiàng)目

    參考視頻 創(chuàng)建一個(gè)項(xiàng)目名稱的文件夾 執(zhí)行命令:npm init -y 快速的創(chuàng)建一個(gè)默認(rèn)的包信息 安裝vite: npm i vite -D -D開(kāi)發(fā)環(huán)境的依賴 安裝vue,現(xiàn)在默認(rèn)是vue3. 執(zhí)行命令: npm i vue -D/-S都可以 創(chuàng)建index.html文件,src=“入口js文件” ,添加id=\\\"app\\\"掛載點(diǎn) 創(chuàng)建src目錄下的js入口文件main.js 創(chuàng)建

    2024年02月09日
    瀏覽(28)
  • Vue3+Vite項(xiàng)目搭建

    Vue3+Vite項(xiàng)目搭建

    技術(shù)棧:vue3+ts+vite+vue-router+element-plus+pinia 為什么選擇vite而不是vue-cli: vite 是一個(gè)基于 Vue3 單文件組件的非打包開(kāi)發(fā)服務(wù)器,它做到了本地快速開(kāi)發(fā)啟動(dòng): 快速的冷啟動(dòng),不需要等待打包操作; 即時(shí)的熱模塊更新,替換性能和模塊數(shù)量的解耦讓更新飛起; 真正的按需編譯,

    2024年02月08日
    瀏覽(33)
  • Vue3 + Vite 實(shí)現(xiàn)項(xiàng)目搭建

    Vue3 + Vite 實(shí)現(xiàn)項(xiàng)目搭建

    首先嘞,這個(gè)博文就是簡(jiǎn)單的記錄一下自己的對(duì) Vue3 的學(xué)習(xí),所以說(shuō)呢,并不代表他是完全正確的。 創(chuàng)建 Vue3 項(xiàng)目有兩種常見(jiàn)的方式,一種是想 vue2 版本一樣使用腳手架工具創(chuàng)建,創(chuàng)建 vue3 項(xiàng)目的腳手架必須是4版本以上的,另一種方法就是使用 vite 創(chuàng)建,為什么使用 vite 呢

    2024年02月11日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包