在Vue组件中收听Electron的ipcRenderer消息

时间:2017-08-06 10:17:27

标签: event-handling vuejs2 electron vue-component

目前,我在Electron应用程序中使用了Vue。在Vue的主要组件内部,可能有多个孩子。每个孩子都会听到可能由Electron的主要流程广播的信号,如下所示:

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的事件系统将信息进一步广播给孩子吗?或者有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

据我了解您当前设置的问题是,您每次创建组件时都会开始侦听,这会导致一个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')
  },

并且只在您启动应用程序时调用一次,

E.g:
In your code
X axis: 1
Y axis: "s1"
will have the Z values as [1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10].