【发布时间】:2019-08-08 13:39:27
【问题描述】:
我使用了第三方组件库的表单组件,它没有禁用道具,并且我通过@click 将单击事件绑定到每个表单项,以便在单击表单项时弹出一个对话框。但这是我的问题,在某些情况下表单项不应该是可点击的,所以我创建了一个自定义的 prevent-click 指令,如下所示:
const clickHandler = e => {
e.stopImmediatePropagation()
e.stopPropagation()
return false
}
const directive = {
bind(el, { value }) {
if (value) {
el.addEventListener('click', clickHandler, true)
}
},
update(el, { value }) {
if (!value) {
el.removeEventListener('click', clickHandler, true)
} else {
el.addEventListener('click', clickHandler, true)
}
}
}
这样使用:
<form-item v-prevent-click="true" @click="showDialog"></form-item>
prevent-click 指令只向表单项添加一个捕获的事件侦听器,这会停止传播,到目前为止一切顺利,但问题是表单项有一个伪子元素被添加通过选择器后的 css。所以当我点击伪子元素时,由于伪子元素本身并没有派发click事件而不是form-item,所以form-item元素还是会派发事件,除了vue内置指令@click事件handler先绑定,导致addEventListener方法的useCapture参数不生效。
在 1.x 版本中,有自定义指令的优先选项,但 2.X 删除了它。那么有什么办法让我的自定义指令在内置@click之前绑定?
【问题讨论】:
-
你能使用事件修饰符吗? vuejs.org/v2/guide/events.html#Event-Modifiers 并将阻止调用直接附加到@click?
-
emmmm,我已经检查了事件修饰符,但我认为它们不适用于我的情况......
-
您也可以尝试添加
e.preventDefault()
标签: javascript vue.js