vue通过new Event实现的自定义事件如何清除避免重复执行

ppylox
·6/14/2022·3 阅读
AI 摘要模型根据正文自动生成,仅供参考

Vue中可通过new Event创建自定义事件,配合window.dispatchEvent触发,并用addEventListener监听。文中以重写localStorage.setItem为例,在写入时派发带newValue和key的自定义事件实现插件回调。关键点:一是在beforeDestroy中必须移除同名事件监听,否则页面再次打开会重复注册导致回调多次执行;二是removeEventListener的事件名和回调函数必须与addEventListener完全一致,否则销毁失效。代码将回调与时间戳事件名存入data,确保注册与销毁对应。

最近在做项目的时候需要给插件实现一个回调方法,正常的方式没法实现,只能通过监听浏览器缓存来实现,了解到js本身是可以通过自定义事件来实现的,平常我们熟悉的click,scroll等等其实就是浏览器本身已经实现的事件,那么如何实现自定义事件呢,比如自定义一个事件customEevent,正常可以通过new Event("customEevent");然后通过window.dispatchEvent来触发这个事件即可。

以下代码供餐看,有两个地方需要特别注意,第一个在页面销毁前一定要销毁同名的自定义方法,否则再次打开这个页面会再次注册,导致回调方法执行多次。第二个销毁的方法名跟时间名必须是同一个,即addEventListener跟removeEventListener的方法名要一致,否则会出现销毁失效的问题

<template>\n  <div class="login"></div>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {cb: null,eventName:null};\n  },\n  mounted() {\n    this.addEvent(this.callBackFunc);\n  },\n  created() {},\n  methods: {\n    callBackFunc: function () {\n      console.log("这个回调方法");\n    },\n    addEvent(cb) {\n      this.cb =  cb\n      this.eventName =  new Date().getTime()\n      var orignalSetItem = localStorage.setItem;\n      let _this = this\n      localStorage.setItem = function (key, newValue) {\n        var setItemEvent = new Event(_this.eventName);\n\n        setItemEvent.newValue = newValue;\n        setItemEvent.newValuekey = key;\n\n        window.dispatchEvent(setItemEvent);\n        orignalSetItem.apply(this, arguments);\n      };\n\n      window.addEventListener(this.eventName,this.cb);\n    },\n  },\n  beforeDestroy() {\n    window.removeEventListener(this.eventName, this.cb);\n  },\n};\n</script>

相关文章