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

372 阅读1分钟

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

1. v-on 参数传递

当通过在 methods 中定义方法,以供 @事件 调用时,需要注意参数问题

  1. 如果定义的方法不需要传参数,那么调用方法时后面的 () 可以不添加;
  2. 如果定义的方法需要传一个参数,而调用方法时后面没有添加 (),那么默认会将事件对象传递给这个参数;
  3. 如果调用方法时想要传事件对象以及其它参数(此时使用了内联语句),那么事件对象可以通过 $event 访问到;

此外,在定义的方法中,默认是可以通过 event 获取到事件对象的。

<template id="my-app">
  <!-- 1. 方法处理器 -->
  <!-- 调用时最后不添加 (),则默认会把事件对象(event)传入 -->
  <button @click="btnClick1">按钮1</button>
  <button @click="btnClick11">按钮11</button>

  <!-- 2. 内联语句 -->
  <button @click="btnClick2('哈哈哈')">按钮2</button>
  <!-- 可以通过 $event 属性访问到事件发生时的事件对象 -->
  <button @click="btnClick3('哈哈哈', $event)">按钮3</button>
</template>

<body> 中的完整代码:

<div id="app"></div>

<template id="my-app">
  <!-- 1. 方法处理器 -->
  <!-- 调用时最后不添加 (),则默认会把事件对象(event)传入 -->
  <button @click="btnClick1">按钮1</button>
  <button @click="btnClick11">按钮11</button>

  <!-- 2. 内联语句 -->
  <button @click="btnClick2('哈哈哈')">按钮2</button>
  <!-- 可以通过 $event 属性访问到事件发生时的事件对象 -->
  <button @click="btnClick3('哈哈哈', $event)">按钮3</button>
</template>

<script src="./js/vue.js"></script>
<script>
  const App = {
    methods: {
      btnClick1() {
        console.log('按钮被点击啦', event);
      },
      btnClick11(e) {
        console.log('按钮被点击啦', e);
      },
      btnClick2(msg) {
        console.log(msg, event);
      },
      btnClick3(msg, e) {
        console.log(event, msg, e);
      }
    },
    template: '#my-app'
  };

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

2. v-on 的修饰符

<template id="my-app">
  <!-- 1. .stop 使用示例 -->
  <!-- 默认情况下,事件会发生冒泡:子元素的点击事件发生后,父元素的点击事件随后也会被触发 -->
  <!-- 可以使用 v-on 的 .stop 修饰符阻止事件冒泡 -->
  <!-- .stop 修饰符内部调用的其实是 event.stopPropagation() -->
  <div @click="divClick">
    <button @click.stop="btnClick">按钮</button>
  </div>

  <!-- 2. .{keyAlias} 之 .enter 使用示例 -->
  <!-- 仅当 keyup 事件(当一个键被释放时触发的事件)是从 enter 键触发时才触发回调 -->
  <input type="text" @keyup.enter="keyup">
</template>

<body> 中的完整代码:

<div id="app"></div>

<template id="my-app">
  <!-- 1. .stop 使用示例 -->
  <!-- 默认情况下,事件会发生冒泡:子元素的点击事件发生后,父元素的点击事件随后也会被触发 -->
  <!-- 可以使用 v-on 的 .stop 修饰符阻止事件冒泡 -->
  <!-- .stop 修饰符内部调用的其实是 event.stopPropagation() -->
  <div @click="divClick">
    <button @click.stop="btnClick">按钮</button>
  </div>

  <!-- 2. .{keyAlias} 之 .enter 使用示例 -->
  <!-- 仅当 keyup 事件(当一个键被释放时触发的事件)是从 enter 键触发时才触发回调 -->
  <input type="text" @keyup.enter="keyup">
</template>

<script src="./js/vue.js"></script>
<script>
  const App = {
    methods: {
      btnClick() {
        console.log('按钮被点击啦');
      },
      divClick() {
        console.log('div 被点击啦');
      },
      keyup() {
        // 可以通过 event.target.value 拿到当前输入的内容
        console.log('keyup', event.target.value);
      }
    },
    template: '#my-app'
  };

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