【问题标题】:Electron JS event is firing multiple timesElectron JS事件多次触发
【发布时间】:2020-09-15 16:21:59
【问题描述】:

在 electronJS 中,我创建了一个自定义应用程序菜单,在其中我将事件从主进程发送到渲染器进程,但现在发生的事情是我正在监听该事件多次运行。因此,如果有人可以帮助我找到并解决错误。谢谢。 这是我的代码:

label: test,
          click: function (item, focusedWindow, event) {
            mainWindow.webContents.send('test')
          }

ipcRenderer.on('test', (event, action) => {
      console.log('called')
    })

现在这个console.log被打印了多次。

原代码:

{
  label: constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.LABEL,
  accelerator: constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.ACCELERATOR,
  click: function (item, focusedWindow, event) {
    contents.send(constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.EVENT)
  }
}

created: function () {
ipcRenderer.on(constants.APPLICATION_MENU.ARTICLE.MENU.KEYWORD.EVENT, () => {
  console.log('clicked')
})

},

【问题讨论】:

  • 代码的上下文很重要。当同一个事件处理程序一次又一次地注册时,这是相当典型的行为,但我只是在猜测,因为您在问题中包含的代码并不完整,无法证明问题。请阅读以下帮助文章:minimal reproducible example.
  • @snwflk 我只是想知道我做错了什么,或者我注册错了。我已经添加了我使用的代码。

标签: vue.js menu electron web-content ipcrenderer


【解决方案1】:

尝试在您的关闭窗口函数中使用ipc.removeAllListeners('your_name_channel'):

Your_Window.on('closed',()=>{
    ipc.removeAllListeners('your_name_channel');
})

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
【解决方案2】:

所以经过大量搜索后,我找到了答案。如果您正在切换路由并在一个组件上注册了一些通道,而在另一个组件上注册了一些通道,那么您可以在生命周期方法中删除特定通道的侦听器(已销毁)组件已卸载。我的问题是我在路由之间切换,每次创建都在运行,我注册了 ipc 渲染器来收听这些频道。 所以我在销毁的生命周期钩子中删除了通道的侦听器。

可以通过以下方式完成:

ipcrenderer.removeAllListeners([频道])

这是文档的链接:Electron

【讨论】:

    【解决方案3】:

    ipcRenderer.on 持续监听,而一次只为下一个事件调用 - 然后被删除。

    ipcRenderer.once(*channel*, *listener*)

    来源:http://man.hubwiz.com/docset/electron.docset/Contents/Resources/Documents/docs/api/ipc-renderer.html

    【讨论】:

    • 感谢您的回复。但是使用一次不起作用,因为它会删除侦听器,而第二次单击菜单项时它根本不起作用。
    • @shawnbatra 那么你的问题可能是由于created 函数被多次调用。就像@snwfkl 提到的那样,您只提供了一小段代码,您的错误不在这里,它在其他地方。
    • @psiphi75 那么,注册它的最佳地点是什么?另一件事是,两条不同的路线上可能有两个组件,我在组件一上注册了一些 ipcrenderer 通道,在另一个上注册了一些。当我切换组件时,它会再次注册,因为每次都会调用创建的函数。如果是这种情况,我该怎么办?
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多