Vue事件处理方法

来自菜鸟教程
跳转至:导航、​搜索

通常,当我们为 Web 开发用户界面时,我们希望自定义 DOM 事件 的行为以提供更丰富的用户体验。 表单提交、按钮点击甚至滚动都有相关的 DOM 事件,这些事件可以被我们的代码监听和处理。 无论我们是想阻止还是改变这些事件的默认行为,我们都需要监听它们并使用这些事件来实现我们想要的行为。

Vue 提供了 v-on 指令,它允许我们通过提供事件名称来侦听和自定义 HTML 元素上的 DOM 事件。 例如,v-on:click 允许我们使用 click DOM 事件。 查看 Mozilla 的 DOM 事件的完整列表 以获得更多可能性。

内联事件处理

使用 v-on 指令,我们可以监听 button 上的 click 事件,并增加一个简单的计数器来跟踪点击量。 通过向 v-on 指令提供 JavaScript 代码,只要触发 click 事件,我们就可以让它在我们的组件 的上下文中执行

内联方法组件.vue

<template>
  <div>
    <h2>InlineMethodComponent</h2>
    <button v-on:click="clicked += 1">
      Clicked {{ clicked }} times
    </button>
  </div>
</template>

<script>
export default {
  name: 'InlineMethodComponent',
  data: function () {
    return {
      clicked: 0
    }
  }
}
</script>

组件方法

现在我们能够处理 DOM 事件,我们将要开始实现变得更加复杂的逻辑。 在 v-on 指令中添加一堆复杂的逻辑是非常麻烦和不好的做法。 幸运的是,Vue 允许我们在组件上定义事件处理 methods。 我们需要做的就是将组件方法的名称传递给 v-on 指令:

简单方法组件.vue

<template>
  <div>
    <h2>SimpleMethodComponent</h2>
    <button v-on:click="log">
      Click Me
    </button>
  </div>
</template>

<script>
export default {
  name: 'SimpleMethodComponent',
  methods: {
    log() {
      console.log('Button clicked!');
    }
  }
}
</script>

内联方法调用

有时我们希望能够将信息传递给我们的方法调用,甚至可以使用 DOM 事件 本身。 除了将 method 的名称传递给 v-on 指令,我们还可以将调用传递给 method 本身,传递我们想要的任何信息。 我们还可以使用包含 DOM 事件本身的特殊变量 $event

内联方法调用组件.vue

<template>
  <div>
    <h2>InlineMethodCallComponent</h2>
    <button v-on:click="log('clicked!', $event)">
      Click Me
    </button>
  </div>
</template>

<script>
export default {
  name: 'InlineMethodCallComponent',
  methods: {
    log(msg, event) {
      console.log(event.target.tagName, msg);
    }
  }
}
</script>

事件方法修饰符

有时我们想修改甚至阻止 DOM 事件 的默认行为。 Vue 为我们提供了一些修饰符,我们可以将这些修饰符链接到我们提供给 v-on 指令的事件名称。

例如,如果我们有一个 form 包含一个类型为 Submitbutton,用户的点击会刷新页面。 对于单页应用程序 (SPA),我们希望避免整页重新加载。 为此,我们可以链接 .prevent 修饰符,通过调用 event.preventDefault() 来防止事件重新加载页面。 .stop 修饰符还通过调用通常需要在自定义事件处理程序中调用的 event.stopPropagation() 来完全停止 DOM 事件的默认行为。

MethodCallModifiersComponent.vue

<template>
  <div>
    <h2>MethodCallModifiersComponent</h2>
    <form
      v-on:submit.stop.prevent="log('clicked!', $event)">
      <button type="Submit">
        Click Me
      </button>
    </form>
  </div>
</template>

<script>
export default {
  name: 'MethodCallModifiersComponent',
  methods: {
    log(msg, event) {
      console.log(event.target.tagName, msg);
    }
  }
}
</script>

事件方法键修饰符

有时我们有由键盘按下触发的 DOM 事件Vue 为我们提供了为基于键的事件量身定制的事件修饰符。

例如,如果我们有一个 input 元素,我们可以监听 EnterEsc 的按键。 通过自定义此行为,我们可以允许 Enter 调用我们的 log() 方法并允许 Escape 为用户提供一种快速重置输入的方法。

MethodCallKeyModifiersComponent.vue

<template>
  <div>
    <h2>MethodCallKeyModifiersComponent</h2>
    <input
      placeholder="Press Enter"
      v-on:keyup.esc.stop="clear"
      v-on:keyup.enter.stop="log"
    />
  </div>
</template>

<script>
export default {
  name: 'MethodCallKeyModifiersComponent',
  methods: {
    log(event) {
      console.log(
        event.target.tagName,
        event.type,
        event.key,
        event.target.value
      );
    },
    clear(event) {
      event.target.value = '';
    }
  }
}
</script>

包起来

多亏了 v-on 指令,我们能够以无痛的方式拦截和自定义 DOM 事件 的行为。 由于这些事件与单个组件相关联,我们不必担心告诉我们的事件处理程序停止侦听 - 当组件被销毁时它们会被销毁。 没有清理!

请务必查看 事件修饰符按键修饰符 的完整参考,以发现它们所允许的可能性!