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

文章介绍了在Vue3中使用自定义指令时,由于addEventListener和removeEventListener参数需一致才能有效解除绑定,而匿名函数无法满足这一条件。通过创建可存储额外数据的事件处理函数,解决了参数传递和事件解绑的问题,防止内存泄漏。

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

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

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

app.directive('copy', {
  mounted(el, binding, vnode, prevVnode) {
    el.addEventListener('click', (e) => {
      console.log(e, el, binding, vnode, prevVnode)
    })
  },
  beforeUnmount(el, binding, vnode, prevVnode) {
    el.removeEventListener('click', (e) => {
      console.log(e, el, binding, vnode, prevVnode)
    })
  }
})

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

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

const clickHandle = function(e) {
  console.log(e)
}
app.directive('copy', {
  mounted(el, binding, vnode, prevVnode) {
    el.addEventListener('click', clickHandle)
  },
  beforeUnmount(el, binding, vnode, prevVnode) {
    el.removeEventListener('click', clickHandle)
  }
})

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

所以我们需要这样写:

const getEventHandle = function (data){
  const fn = (e) => {
    if (!e._kpma_vts) {
      e._kpma_vts= Date.now()
    } else if (e._kpma_vts<= fn.attached) {
      return
    }
    e.stopPropagation()
    e.preventDefault()
    fn.callBack(e)
  }
  fn.attached = Date.now()
  Object.assign(fn, data)
  return fn
}
const clickHandle = function(e){
  console.log(e)
  const {el, binding, vnode, prevVnode} = this
  console.log(el, binding, vnode, prevVnode)
}
app.directive('copy', {
  mounted(el, binding, vnode, prevVnode) {
    el._kpma_event = getEventHandle({el, binding, vnode, prevVnode, callBack: clickHandle})
    el.addEventListener('click', el._kpma_event)
  },
  beforeUnmount(el) {
    el.removeEventListener('click', el._kpma_event)
  }
})

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值