当前位置:   article > 正文

vue 自定义指令中:addEventlistener监听事件函数传参,使用removeEventListener解绑_vue3 移除addeventlistener

vue3 移除addeventlistener

一般在组件中使用addeventlistener添加事件监听的时候,在组件销毁的时候都要使用removeEventListener进行销毁,不然会造成内存泄漏。

但是addeventlistener和removeEventListener的参数必须是一样的,才有效

例如:在vue3中添加全局自定义指令

  1. app.directive('copy', {
  2. mounted(el, binding, vnode, prevVnode) {
  3. el.addEventListener('click', (e) => {
  4. console.log(e, el, binding, vnode, prevVnode)
  5. })
  6. },
  7. beforeUnmount(el, binding, vnode, prevVnode) {
  8. el.removeEventListener('click', (e) => {
  9. console.log(e, el, binding, vnode, prevVnode)
  10. })
  11. }
  12. })

上面我们在自定义指令的时候在mounted中对dom添加事件监听,在beforeUnmount中进行事件解绑,但是第二个参数是匿名函数,所以add和remove的函数不是同一个所以参数不一致,remove是无效的

当我们修改成参数一致时:

  1. const clickHandle = function(e) {
  2. console.log(e)
  3. }
  4. app.directive('copy', {
  5. mounted(el, binding, vnode, prevVnode) {
  6. el.addEventListener('click', clickHandle)
  7. },
  8. beforeUnmount(el, binding, vnode, prevVnode) {
  9. el.removeEventListener('click', clickHandle)
  10. }
  11. })

上面这样写确实可以消除掉绑定的事件,但是无法进行参数的传递无法再函数中使用el,biinding等参数

所以我们需要这样写:

  1. const getEventHandle = function (data){
  2. const fn = (e) => {
  3. if (!e._kpma_vts) {
  4. e._kpma_vts= Date.now()
  5. } else if (e._kpma_vts<= fn.attached) {
  6. return
  7. }
  8. e.stopPropagation()
  9. e.preventDefault()
  10. fn.callBack(e)
  11. }
  12. fn.attached = Date.now()
  13. Object.assign(fn, data)
  14. return fn
  15. }
  16. const clickHandle = function(e){
  17. console.log(e)
  18. const {el, binding, vnode, prevVnode} = this
  19. console.log(el, binding, vnode, prevVnode)
  20. }
  21. app.directive('copy', {
  22. mounted(el, binding, vnode, prevVnode) {
  23. el._kpma_event = getEventHandle({el, binding, vnode, prevVnode, callBack: clickHandle})
  24. el.addEventListener('click', el._kpma_event)
  25. },
  26. beforeUnmount(el) {
  27. el.removeEventListener('click', el._kpma_event)
  28. }
  29. })

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号