Vue 3 事件处理

在 Vue 3 中,事件处理是响应用户交互的核心功能。通过事件处理,你可以捕捉用户在 DOM 元素上的操作(如点击、输入、键盘事件等),并在 Vue 组件中执行相关的逻辑。

Vue 提供了简洁的语法来绑定事件、监听事件,并执行相应的处理函数。

1. 基本的事件绑定

你可以使用 v-on 指令(或其简写 @)来监听 DOM 事件并触发处理函数。

1.1. 绑定事件

<template>
  <div>
    <button @click="handleClick">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = () => {
      console.log("Button clicked!");
    };

    return {
      handleClick
    };
  }
};
</script>

在上面的例子中,当用户点击按钮时,handleClick 方法会被触发,控制台会输出“Button clicked!”。

2. 事件处理函数

事件处理函数可以是普通的 JavaScript 函数,也可以是组件的 methods 中的方法。在 Vue 3 中,推荐使用 Composition APIsetup 函数来组织代码。

2.1. 传递事件对象

你还可以通过事件处理函数访问原生 DOM 事件对象,它包含有关事件的详细信息。

<template>
  <div>
    <button @click="handleClick">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = (event) => {
      console.log("Button clicked!", event);
    };

    return {
      handleClick
    };
  }
};
</script>

event 对象包含事件的相关信息,如触发事件的元素、事件类型、鼠标的位置等。

3. 修饰符

Vue 提供了事件修饰符,可以简化事件处理函数的某些常见场景。常用的修饰符包括:

  • .stop:调用 event.stopPropagation() 来阻止事件冒泡。
  • .prevent:调用 event.preventDefault() 来阻止事件的默认行为。
  • .capture:将事件监听器设置为捕获模式。
  • .once:事件只会触发一次,之后自动移除事件监听器。
  • .passive:设置事件为 passive,意味着你不打算调用 preventDefault()

3.1. 使用 .stop.prevent

<template>
  <div>
    <button @click.stop="handleClick">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = () => {
      console.log("Button clicked, and event propagation is stopped.");
    };

    return {
      handleClick
    };
  }
};
</script>

在上面的代码中,@click.stop 会阻止事件冒泡。

3.2. 使用 .once

<template>
  <div>
    <button @click.once="handleClick">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = () => {
      console.log("Button clicked! This will only trigger once.");
    };

    return {
      handleClick
    };
  }
};
</script>

使用 .once 修饰符,事件处理函数只会被触发一次。

4. 事件参数

你可以将事件参数传递给事件处理函数。

4.1. 传递自定义参数

<template>
  <div>
    <button @click="handleClick('Hello World')">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = (message) => {
      console.log(message); // 输出 "Hello World"
    };

    return {
      handleClick
    };
  }
};
</script>

在这个例子中,handleClick 接收一个自定义的字符串参数 "Hello World",并在控制台输出它。

4.2. 传递原生事件对象和自定义参数

<template>
  <div>
    <button @click="handleClick($event, 'Hello World')">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = (event, message) => {
      console.log(event);   // 原生事件对象
      console.log(message); // "Hello World"
    };

    return {
      handleClick
    };
  }
};
</script>

在这个例子中,$event 表示原生的 DOM 事件对象,message 是你传递给处理函数的自定义参数。

5. 事件修饰符与多个事件

Vue 还允许你通过 v-on 绑定多个事件,并同时使用多个修饰符。

<template>
  <div>
    <button @click.stop.prevent="handleClick">Click Me</button>
  </div>
</template>

<script>
export default {
  setup() {
    const handleClick = () => {
      console.log("Button clicked, propagation stopped and default action prevented.");
    };

    return {
      handleClick
    };
  }
};
</script>

在这个例子中,点击按钮时,事件的默认行为和冒泡都会被阻止。

6. 自定义事件

除了原生的 DOM 事件外,Vue 还支持自定义事件。你可以通过 $emit 方法来触发自定义事件,并通过父组件来监听这些事件。

6.1. 子组件触发自定义事件

<!-- Child.vue -->
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  setup() {
    const sendMessage = () => {
      // 触发自定义事件,并传递数据
      this.$emit('messageSent', 'Hello from child!');
    };

    return {
      sendMessage
    };
  }
};
</script>

6.2. 父组件监听自定义事件

<!-- Parent.vue -->
<template>
  <div>
    <Child @messageSent="handleMessage" />
  </div>
</template>

<script>
import Child from './Child.vue';

export default {
  components: {
    Child
  },
  setup() {
    const handleMessage = (message) => {
      console.log(message); // "Hello from child!"
    };

    return {
      handleMessage
    };
  }
};
</script>

在这个例子中,Child 组件触发了 messageSent 事件,而 Parent 组件监听该事件并执行 handleMessage 方法。

7. 总结

  • 事件绑定:使用 v-on(或 @)来绑定事件,触发组件的方法或处理函数。
  • 事件修饰符:Vue 提供了多个修饰符(如 .stop.prevent.once)来简化常见事件处理场景。
  • 传递参数:你可以将自定义参数或原生事件对象传递给事件处理函数。
  • 自定义事件:通过 $emit 触发自定义事件,父组件可以通过 v-on 监听和处理这些事件。

Vue 3 的事件处理机制让你能够轻松响应用户输入,并将复杂的事件逻辑分离到组件方法中,从而实现清晰、简洁的代码结构。