Vue指令的优先级?

时间:2019-03-18 08:18:41

标签: javascript vue.js

我使用了第三方组件库的表单组件,该组件没有禁用道具,并且我通过@click将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指令除了将捕获的事件侦听器添加到form-item之外不执行任何操作,这将阻止传播,到目前为止一切进展顺利,但是问题在于form-item中添加了伪子元素通过选择器后的CSS。因此,当我单击伪子元素时,由于伪子元素本身不会调度click事件而不是form-item,因此除了vue内置指令@click事件之外,form-item元素仍将调度该事件。处理程序首先被绑定,导致addEventListener方法的useCapture参数无效。

在1.x版本中,有custom指令的优先级选项,但是2.X删除了它。那么,是否有比内置@click更早绑定我的自定义指令的信息?

2 个答案:

答案 0 :(得分:1)

您应该使用Vue的内置事件修饰符(参考here)。试试这个:

<form-item @click.stop.prevent="showDialog"></form-item>

我不知道您的第三方组件框架是什么,但是如果您真的需要自己处理preventDefault,建议您执行以下操作:

模板

<form-item @click="showDialog"></form-item>

脚本

methods: {
    showDialog(e) {
        e.preventDefault();
        // Your code to display dialog...
    }
}

如果您还需要将参数传递给showDialog,请记住,您可以-只需将事件作为第一个参数传递即可:

<form-item @click="showDialog($event, urData)"></form-item>

答案 1 :(得分:0)

请考虑将标志传递到showDialog。如果您无法修改showDialog函数,请将其包装在另一个函数中:

// Your compoennt template
<form-item @click="wrappedShowDialog(true)"></form-item>

// Vue.js component
wrappedShowDialog(isAllowed) {
    if (isAllowed) {
        this.showDialog();
    }
}