2017-08-06 112 views
0

目前,我在Electron應用程序中使用了Vue。在Vue的主組件中,可能有多個子組件。每個孩子聽可能由電子的主要過程中播放,像這樣一個信號:在Vue組件中偵聽Electron的ipcRenderer消息

export default { 
    ... 
    created() {  
     ipcRenderer.on('set-service-status', (e, data) => { 
      // something with the data 
     }) 
    } 
    ... 
} 

然而,當有超過11個的子組件,節點引發錯誤MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 set-service-status listeners added. Use emitter.setMaxListeners() to increase limit。這是有道理的,因爲正在設置多個事件監聽器,每個組件都有一個監聽器。

這怎麼解決?我是否應該聽主組件內的set-service-status信號,然後使用Vue的事件系統將消息進一步廣播給孩子們?還是有更好的方法來處理這個問題?

回答

0

因爲我的理解與您當前的設置問題是,您開始收聽每個組件創建和這導致有一個IPC電話很多聽衆的問題。

而不是通過created()收聽,將此邏輯放在您的vuex 中,並且只調用一次。或者您仍然可以在條目文件中使用created(),這是主要的根組件。並將數據作爲道具提供給您的孩子組件。這也是有效的。例如

;

function setupIpc(dispatch) { 
 
    ipcRenderer.on('set-service-status', (e, data) => { 
 
     // something with the data 
 
    }) 
 
    ipcRenderer.on('fullscreenChanged', (e, args) => { 
 
    dispatch('fullscreenHandler', args) 
 
    }) 
 
    ipcRenderer.send('ipcReady') 
 
}

只有當你啓動應用程序調用一次,

updateState({ commit, dispatch }) { 
 
    setupIpc(dispatch) 
 
    setInterval(() => { dispatch('stateSaveImmediate') }, 5000) 
 
    dispatch('init') 
 
    ipcRenderer.once('configGet', (e, data) => { 
 
     if (data === !null || !undefined) { 
 
     commit(ActionTypes.UPDATE_STATE, data) 
 
     } else { 
 
     commit(ActionTypes.UPDATE_STATE_ERROR_NO_CONFIG_FILE) 
 
     } 
 
     dispatch('doSomething') 
 
    }) 
 
    ipcRenderer.send('configGet') 
 
    },

+0

你假定我使用vuex作爲國家管理者點擊這裏。事實並非如此。一旦收到信號,我只想執行可視化更新(顯示加載程序)。如果這涉及到引入vuex這很好,但也會造成更多的複雜性。應該有一個簡單的方法來做到這一點,而不必明確依賴國家經理否? – Maarten

+0

我剛剛更新了另一種方式,但這是一種很冒險的方式,因爲在某種情況下,如果您強制更新根組件,您將再次啓動多個「ipcRenderer」消息。你可以通過'Devtron'工具來檢查這個工具 - IPC channel – Necmttn

+0

我實際上一直在想自己在主組件中有一個監聽器,並且讓這個監聽器在孩子的後面播放vue事件:'Vue。$ root。$ emit(' set-service-status',componentId)'。 ('set-service-status',(id)=> {//檢查組件id是否與廣播的id相匹配,然後執行一些操作}) – Maarten

相關問題