首頁>技術>

最近一直在搗鼓vue3electron技術開發跨平臺應用。今天給大家分享的是electron實現主/渲染程序間的通訊,實現仿QQ換膚功能。

專案中使用的Electron為最新穩定版v11.2.3。運用了 vue-cli-plugin-electron-builder 腳手架構建專案。

如上圖:支援圖片+純漸變色兩種面板。

<li class="item"><img class="bg" src="@assets/img/skin/img-skin01.jpg" @click="handleSetSkin('url', 1)" /></li><li class="item"><div class="bg linear" @click="handleSetSkin('color', 'linear-gradient(135deg, #00d2ff, #00e77f)')">櫻草青蔥</div></li>
export default {    setup() {        // 設定換膚        const handleSetSkin = (type, val) => {            let skinUrl            if(type == 'url') {                skinUrl = val ? `url(${require(`@assets/img/skin/img-skin0${val}.jpg`)})` : ''            }else {                skinUrl = val ? val : ''            }            let data = {                type: 'MSG_TYPE_SKIN',                value: skinUrl,            }            setWinData(data)            // ...測試            setWinData({ type: 'MSG_TYPE_TEST', value: '這是一段測試通訊' })        }        return {            handleSetSkin,        }    }}</script>

setWinData函式處理主/渲染程序資料通訊。渲染程序向主程序傳送事件。

/** * @desc 主|渲染程序資料傳遞 * @param args {object} {type: 'MSG_TYPE_XXX', value: 123} */export function setWinData(args) {    ipcRenderer.send('win-setdata', args)}

在主程序中監聽渲染程序傳送的事件,並傳給相應的窗體。

ipcMain.on('win-setdata', (event, args) => {	for(let i in this.winLs) {		let win = this.getWin(i)		if(win) win.webContents.send('win-postdata', args)	}})

在App.vue中監聽剛才在主程序傳送的事件。

<script>import { ipcRenderer } from 'electron'import { onMounted } from 'vue'import { useStore } from 'vuex'export default {  name: 'App',  components: {},  setup() {    const store = useStore()    onMounted(() => {      // 面板初始化      let skin = localStorage.getItem('skin') || ''      store.commit('SET_SKIN', skin)      /**       * 接收主程序傳送的事件       */      ipcRenderer.on('win-logout', () => {        store.commit('LOGOUT')      })      ipcRenderer.on('win-postdata', (event, args) => {        switch(args.type) {          case 'MSG_TYPE_SKIN':            store.commit('SET_SKIN', args.value)          break;          case 'MSG_TYPE_TEST':            console.log('MSG_TYPE_TEST:' + args.value)          break;        }      })    })    return {      ...    }  }}</script>

這樣就簡單地實現了主/渲染程序通訊,即可以讓新開視窗的資料傳回給另一個視窗,實現資料的雙向更新。

8
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 點陣圖資料結構及其在-Java和-Redis中的應用