vue.js - 如何在 Vue 指令中删除使用 vnode.context.$on 创建的事件?
问题描述
在指令绑定上,我为事件“验证”创建了一个侦听器以运行函数 updateMessage:
vnode.context.$on('validate', () => {
updateMessage(el, vm);
});
取消绑定指令时如何删除或覆盖它?
directives: {
validate: {
bind(el, _, vnode) {
const vm = vnode.context;
el.addEventListener('input', e => {
updateMessage(e.target, vm);
});
vnode.context.$on('validate', () => {
updateMessage(el, vm);
});
console.log('bind', el)
},
unbind(el, _, vnode) {
el.removeEventListener('input', e => {
updateMessage(e.target, vm);
});
console.log('unbind',el)
},
}
},
解决方案
要删除此特定事件处理程序,您需要存储对处理程序函数的引用。你也需要为你的输入事件处理程序做同样的事情。
例如(假设在某处updateMessage
定义),将事件处理程序存储在元素实例上,以便稍后引用它们
validate: {
bind(el, _, vnode) {
const vm = vnode.context
el.inputEventHandler = e => updateMessage(e.target, vm)
el.validateEventHandler = () => updateMessage(el, vm)
el.addEventListener('input', el.inputEventHandler)
vm.$on('validate', el.validateEventHandler)
},
unbind(el, _, vnode) {
el.removeEventListener('input', el.inputEventHandler)
vnode.context.$off('validate', el.validateEventHandler)
}
}
感谢Decade Moon关于将函数存储在元素上的想法。
推荐阅读
- rust - 在循环内访问向量的元素时遇到问题
- javascript - Chart.js - 缩小图例以适应数据
- reactjs - 在 ReactJS 中,当您在表单组件中选择某些内容时,如何更改所有项目的边框颜色?
- python - 用于列中具有特定值的行计数的新数据框列,具有相同的客户 ID 列且小于日期和时间
- excel - Tableau 正在添加多次出现的数字。我怎样才能解决这个问题?
- azure - 在天蓝色中设置 showPii
- c - 如何检查字符串中是否存在至少三个数字?
- r - 基于两列创建年龄变量
- vb.net - 用 100 个结果对 10 个值进行线性插值的最简单方法
- swift - Swift SpriteKit SKSpriteNode 移动