Vue结合了事件处理程序

the*_*he_ 15 html javascript vue.js

我有以下Vue事件处理程序与contenteditable:

<div contentEditable="true"
v-on:keyup="changed($event, current, 0)"
v-on:paste="changed($event, current, 0)"
v-on:blur="changed($event, current, 0)"
v-on:delete="changed($event, current, 0)"
v-on:focused="changed($event, current, 0)"></div>
Run Code Online (Sandbox Code Playgroud)

但是,我有很多地方可以调用相同的代码并且代码变得冗长而冗长.有没有办法组合事件处理程序?就像是:

v-on:keyup:paste:blur:delete:focused

Yve*_*ves 5

您可以为此目的创建自定义指令。此示例可以帮助您:

Vue.directive('wrap-on', {
  bind: function(el, binding, vnode) {
    // Keep function to remove the event later.
    el.wrappedEventFunctions = el.wrappedEventFunctions || {};
    el.wrappedEventFunctions[binding.rawName] = binding.value;

    for (var key in binding.modifiers) {
      // Check if element is a vue component
      if (vnode.componentInstance) {
        vnode.componentInstance.$on(key, binding.value);
      } else {
        el.addEventListener(key, binding.value);
      }
    }
  },
  unbind: function(el, binding, vnode) {
    for (var key in binding.modifiers) {
      if (vnode.componentInstance) {
        vnode.componentInstance.$off(key, el.wrappedEventFunctions[binding.rawName]);
      } else {
        el.removeEventListener(key, el.wrappedEventFunctions[binding.rawName]);
      }
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

该指令将向元素添加事件处理程序。它检查该元素是否是 vue 组件;如果它是一个 vue 组件,它会通过 注册事件$on。如果它不是 vue 组件,则使用addEventListener. 如果您愿意,您可以更改此行为。

用法如下:

<input v-wrap-on.click.keydown="mixedCallback" />
Run Code Online (Sandbox Code Playgroud)

或者:

<some-custom-component v-wrap-on.click.keydown="mixedCallback">
    ...
</some-custom-component>
Run Code Online (Sandbox Code Playgroud)


tha*_*ksd 1

我认为目前没有办法组合您所描述的事件侦听器。

您可以做的就是使这个 div 成为它自己的包装组件(例如,名为“editable-wrapper”)并发出一个change事件:

<div
  contentEditable="true"
  v-on:keyup="$emit('change', {$event, current} )"
  v-on:paste="$emit('change', {$event, current} )"
  v-on:blur="$emit('change', {$event, current} )"
  v-on:delete="$emit('change', {$event, current} )"
  v-on:focused="$emit('change', {$event, current} )">
</div>
Run Code Online (Sandbox Code Playgroud)

然后你只需要监听组件上的一个更改事件(data是一个具有$event, 和current属性的对象):

<editable-wrapper @change="changed(data)"></editable-wrapper>
Run Code Online (Sandbox Code Playgroud)