Vue 模板语法——事件监听(1)

377 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前面我们用 Mustache 语法、v-textv-html 绑定了元素的内容,用 v-bind 绑定了元素的属性,而在前端开发中还有另外一个非常重要的特性:交互

在前端开发中,我们需要经常和用户进行各种各样的交互,这时,我们必须监听用户触发的事件(点击拖拽键盘事件等等)。

Vue 中如何监听事件呢?我们可以使用 v-on 指令。

1. v-on 介绍

  • 缩写:@
  • 预期:Function | Inline Statement | Object
  • 参数:event
  • 修饰符:
    • .stop - 调用 event.stopPropagation()
    • .prevent - 调用 event.preventDefault()
    • .capture - 添加事件侦听器时使用 capture 模式。
    • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    • .{keyAlias} - 仅当事件是从特定键触发时才触发回调。
    • .once - 只触发一次回调。
    • .left - 只当点击鼠标左键时触发。
    • .right - 只当点击鼠标右键时触发。
    • .middle - 只当点击鼠标中键时触发。
    • .passive - {passive: true} 模式添加侦听器。
  • 用法:绑定事件监听器

2. v-on 基本使用

<template id="my-app">

  <!-- 1. 可以绑定方法 -->
  <!-- 完整写法:v-on:监听的事件="methods 中的方法" -->
  <!-- 比如监听点击的事件 -->
  <button v-on:click="btnClick">按钮1</button>
  <!-- 比如监听指针设备(通常指鼠标)在元素上移动的事件 -->
  <div class="area" v-on:mousemove="mouseMove">我是 div</div>

  <!-- v-on 的语法糖(简写/缩写)形式:@ -->
  <!-- v-on:click 可以简写成 @click -->
  <button @click="btnClick">按钮2</button>

  <!-- 2. 可以绑定内联语句 -->
  <button v-on:click="counter++">按钮3</button>
  <button v-on:click="if (isCount) { counter++; }">按钮4</button>
  <!-- 内联语句中涉及到了参数的传递,下一小节会讲 -->
  <button v-on:click="btnClick2('哈哈哈')">按钮5</button>
  <button v-on:click="btnClick3('哈哈哈', $event)">按钮6</button>
  <h2>{{ counter }}</h2>

  <!-- 3. 可以不带参数绑定一个“事件/监听器”键值对的对象 -->
  <!-- 这样可以实现一个元素上同时绑定多个事件 -->
  <!-- 格式:v-on="“事件/监听器”键值对对象" -->
  <div class="area" v-on="{ click: btnClick, mousemove: mouseMove}">我也是 div</div>
  <!-- 不带参数时也可以使用语法糖,但阅读性不太好,不够直观,不推荐这样简写 -->
  <div class="area" @="{ click: btnClick, mousemove: mouseMove}">我也是 div</div>
</template>

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <style>
    .area {
      width: 100px;
      height: 100px;
      background-color: #c7edcc;
    }
  </style>
</head>
<body>
  <div id="app"></div>

  <template id="my-app">

    <!-- 1. 可以绑定方法 -->
    <!-- 完整写法:v-on:监听的事件="methods 中的方法" -->
    <!-- 比如监听点击的事件 -->
    <button v-on:click="btnClick">按钮1</button>
    <!-- 比如监听指针设备(通常指鼠标)在元素上移动的事件 -->
    <div class="area" v-on:mousemove="mouseMove">我是 div</div>

    <!-- v-on 的语法糖(简写/缩写)形式:@ -->
    <!-- v-on:click 可以简写成 @click -->
    <button @click="btnClick">按钮2</button>

    <!-- 2. 可以绑定内联语句 -->
    <button v-on:click="counter++">按钮3</button>
    <button v-on:click="if (isCount) { counter++; }">按钮4</button>
    <!-- 内联语句中涉及到了参数的传递,下一小节会讲 -->
    <button v-on:click="btnClick2('哈哈哈')">按钮5</button>
    <button v-on:click="btnClick3('哈哈哈', $event)">按钮6</button>
    <h2>{{ counter }}</h2>

    <!-- 3. 可以不带参数绑定一个“事件/监听器”键值对的对象 -->
    <!-- 这样可以实现一个元素上同时绑定多个事件 -->
    <!-- 格式:v-on="“事件/监听器”键值对对象" -->
    <div class="area" v-on="{ click: btnClick, mousemove: mouseMove}">我也是 div</div>
    <!-- 不带参数时也可以使用语法糖,但阅读性不太好,不够直观,不推荐这样简写 -->
    <div class="area" @="{ click: btnClick, mousemove: mouseMove}">我也是 div</div>
  </template>

  <script src="./js/vue.js"></script>
  <script>
    const App = {
      data() {
        return {
          message: '你好啊',
          isCount: true,
          counter: 0
        }
      },
      methods: {
        btnClick() {
          console.log('按钮被点击啦');
        },
        btnClick2(msg) {
          console.log(msg, event);
        },
        btnClick3(msg, event) {
          console.log(msg, event);
        },
        mouseMove() {
          console.log('鼠标移动啦');
        }
      },
      template: '#my-app'
    };

    Vue.createApp(App).mount('#app');
  </script>
</body>
</html>