学无先后,达者为师

网站首页 编程语言 正文

设置setInterval定时器、postMessage、addEventListener监听器

作者:大橙子额 更新时间: 2022-03-03 编程语言

项目中经常会使用到addEventListener,setInterval,非常好用,但也会有一些意想不到的bug。
场景:项目中在mounted中绑定了一个监听器window.addEventListener('message', this.getList),父子页面间通过postMessage发送消息,然后就出现了bug,this.getList调用了好几次,刚开始没有规律,以为代码有问题,postMessage发送了好几条消息,又以为是监听到了其他页面发的消息,排查后发现都不是,并且发现规律,每跳转一次页面就会多发送一次消息,才想到是监听器没有销毁,于是每次进页面都会绑定一次监听,导致getList执行多次。

设置后一定要销毁,否则监听会一直存在。

设置定时器

setinterval 不会自动关闭
在要设置定时器的地方

this.timer = setInterval(function() {
  self.getList()
}, 1000 * 60)

定时器最好不要直接写在mounted,建议写在methods里
然后一定要销毁定时器,避免浪费资源。
也可以在methods中销毁定时器,但是不销毁的话就会一直执行

beforeDestroy(){
  if (this.timer) {
     clearInterval(this.timer); // 在Vue实例销毁前,清除我们的定时器
   }
 },

addEventListener监听

在一个项目的页面中嵌入另一个项目的页面,需要实现父子,子父页面的通信。
window.postMessage() 方法可以安全地实现跨源通信。
但是一定要清除监听
在这里插入图片描述

页面监听一般写在mounted中

window.addEventListener('message', this.getList)
this.iframeWin = this.$refs.iframe.contentWindow  //获取到iframe的contentWindow属性

iframe与页面间传消息一般采用postMessage

// 向父vue页面发送信息
this.iframeWin.postMessage({
  cmd:'writeDeviceName',
  params:{
    data:{
      msg:this.msg
    }
  },
}, '*')

beforeRouteLeave:离开路由之前执行的函数,可用于页面的反向传值,页面跳转。
离开路由前销毁监听,也可以写在methods中,自行判断并销毁

beforeRouteLeave(to,from,next){
  window.removeEventListener('message', this.handleMessage)
  next()
},

原文链接:https://blog.csdn.net/weixin_43043994/article/details/100156188

栏目分类
最近更新