在 Vue 路由器页面之间切换会导致 VueJS 上的多个事件触发()

Posted

技术标签:

【中文标题】在 Vue 路由器页面之间切换会导致 VueJS 上的多个事件触发()【英文标题】:Switching between Vue Router pages cause multiple event fire on VueJS mounted() 【发布时间】:2020-12-05 17:36:12 【问题描述】:

我正在开发一个 Electron 项目,我使用 Vue CLI 项目和 Vue CLI Plugin Electron Builder。一切都很好,除了我最近发现的一个奇怪的错误。

每当我在页面(Vue 路由器)之间导航时,我从组件 mounted() 属性监听的事件都会变成两倍。这实际上是N+1 的问题。

为了更清楚地描述问题,我有两个Home.vueHelloWorld.vue 组件。从Home.vue 组件,每当单击按钮并从同一组件mounted() 属性监听event.reply() 时,我都会向main 进程发送一个事件。在这个阶段完全符合预期。

但是,每当我转到HelloWorld 页面并再次切换回Home 页面时,当我单击按钮从main 进程发送和接收event 时,我不仅看到一个event,即使我只单击一次,但我看到两个event 回复。如果我再次在页面之间切换,我会看到三个event 回复等等,比如N+1 问题。

为了您的方便,我制作了一个快速 GIF,可以清楚地显示问题。

Home.vue

<template>
  <div class="home">
    <button @click="send()">Home</button>
  </div>
</template>

<script>
export default 
  name: "Home",
  data() 
    return 
      cause: null
    
  ,
  mounted() 
    window.ipcRenderer.on("home:reply", event => console.log(event));
  ,
  methods: 
    send() 
      window.ipcRenderer.send("home");
    
  ,
;
</script>

main.js

ipcMain.on("home", event => 
  return event.reply("home:reply");
);

我在 Vue 路由器上没有什么特别之处,它只是 Vue CLI 附带的默认脚手架。正如您在上面的代码 sn-p 中看到的,我所做的只是在单击按钮时发送一个事件,并从同一组件 mounted() 属性监听相同的事件回复。

我还在 Stack Overflow 上找到了a similar topic,但我自己无法弄清楚。我不知道我的代码有什么问题????

【问题讨论】:

【参考方案1】:

当组件被销毁时,你需要取消注册事件处理程序,否则每次挂载组件时你都会一遍又一遍地注册相同的事件处理程序。

mounted() 
  window.ipcRenderer.on('home:reply', this.handleHomeReply)
,

destroyed() 
  window.ipcRenderer.off('home:reply', this.handleHomeReply)
,

methods: 
  handleHomeReply(event) 
    console.log(event)
  

【讨论】:

这也是为什么你应该总是为你的事件处理程序使用命名函数,而不是 (ev)=&gt;... 风格,即使后者在 ... 位简短而简单时可能非常诱人(就像问题一样)。 该死的,就是这样。谢啦!我在任何地方都没有找到任何关于ipcRenderer.off() 的文件,也没有真正想到它✌️

以上是关于在 Vue 路由器页面之间切换会导致 VueJS 上的多个事件触发()的主要内容,如果未能解决你的问题,请参考以下文章

第一个 vuejs http://www.cnblogs.com/avon/p/5943008.html

vue3实践---路由router

Vue多个路由共用同一组件时,互相切换时更新组件

vue: 关于多路由公用模板,导致组件内数组缓存问题

与 vuejs 和 laravel 中的不同语言页面交互

带有firebase的Vue js不切换页面[重复]