「Vue3系列」Vue3 事件处理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 在 Vue 3 中,事件处理与 Vue 2 非常相似,但有一些细微的改进和新的语法。Vue 3 仍然使用 `v-on` 指令来处理 DOM 事件,或者更常见的是使用其简写形式 `@`。

一、Vue3 事件处理

在 Vue 3 中,事件处理与 Vue 2 非常相似,但有一些细微的改进和新的语法。Vue 3 仍然使用 v-on 指令来处理 DOM 事件,或者更常见的是使用其简写形式 @

下面是一些 Vue 3 中事件处理的基本概念和示例:

基本用法

你可以使用 @ 符号来监听 DOM 事件,并在触发时执行一些 JavaScript 代码。

<template>
  <button @click="handleClick">点击我</button>
</template>

<script>
export default {
    
  setup() {
    
    const handleClick = () => {
    
      console.log('按钮被点击了!');
    };

    return {
    
      handleClick
    };
  }
}
</script>

事件处理函数

事件处理函数可以直接在模板中定义,也可以在 setup 函数中定义并返回。

<template>
  <!-- 直接在模板中定义事件处理函数 -->
  <button @click="() => console.log('按钮被点击了!')">点击我</button>

  <!-- 使用 setup 中定义的事件处理函数 -->
  <button @click="handleClick">点击我</button>
</template>

<script>
export default {
    
  setup() {
    
    const handleClick = () => {
    
      console.log('按钮被点击了!');
    };

    return {
    
      handleClick
    };
  }
}
</script>

传递参数

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

<template>
  <button @click="handleClick('Hello, Vue 3!')">点击我</button>
</template>

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

    return {
    
      handleClick
    };
  }
}
</script>

事件修饰符

Vue 3 仍然支持事件修饰符,如 .stop.prevent.capture.self 等。

<template>
  <form @submit.prevent="handleSubmit">
    <input type="text" @keyup.enter="handleEnter" />
  </form>
</template>

<script>
export default {
    
  setup() {
    
    const handleSubmit = (event) => {
    
      event.preventDefault();
      console.log('表单提交被阻止了');
    };

    const handleEnter = () => {
    
      console.log('Enter 键被按下');
    };

    return {
    
      handleSubmit,
      handleEnter
    };
  }
}
</script>

自定义事件

在 Vue 组件中,你可以使用 $emit 方法触发自定义事件,并在父组件中监听这些事件。

<!-- ChildComponent.vue -->
<template>
  <button @click="emitClick">点击我</button>
</template>

<script>
export default {
    
  setup(props, {
     emit }) {
    
    const emitClick = () => {
    
      emit('click'); // 触发名为 "click" 的自定义事件
    };

    return {
    
      emitClick
    };
  }
}
</script>

在父组件中监听自定义事件:

<!-- ParentComponent.vue -->
<template>
  <ChildComponent @click="handleChildClick" />
</template>

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

export default {
    
  components: {
    
    ChildComponent
  },
  setup() {
    
    const handleChildClick = () => {
    
      console.log('子组件的 "click" 事件被触发了');
    };

    return {
    
      handleChildClick
    };
  }
}
</script>

这些是 Vue 3 中事件处理的基本概念。Vue 3 还提供了更高级的事件处理功能,如事件监听器的条件化、事件侦听器的批量管理、使用 v-model 进行表单输入和应用状态之间的双向绑定等。

二、vue3 事件修饰符

在 Vue 3 中,事件修饰符仍然是一个方便的工具,用于在模板中直接修改 DOM 事件的默认行为。下面是一些 Vue 3 中常用的事件修饰符及其案例:

阻止默认行为

.prevent - 调用 event.preventDefault()

<template>
  <form @submit.prevent="handleSubmit">
    <input type="submit" value="Submit" />
  </form>
</template>

<script>
export default {
    
  setup() {
    
    const handleSubmit = () => {
    
      console.log('表单提交被阻止了');
    };

    return {
    
      handleSubmit
    };
  }
}
</script>

阻止事件冒泡

.stop - 调用 event.stopPropagation()

<template>
  <div @click="outerClick">
    外层
    <button @click.stop="innerClick">内层按钮</button>
  </div>
</template>

<script>
export default {
    
  setup() {
    
    const outerClick = () => {
    
      console.log('外层被点击');
    };

    const innerClick = () => {
    
      console.log('内层按钮被点击');
    };

    return {
    
      outerClick,
      innerClick
    };
  }
}
</script>

捕获阶段触发

.capture - 使用事件捕获模式,即元素自身的事件先不触发,等待该元素的所有祖先元素的事件触发完毕之后,才会触发该元素的事件。

<template>
  <div @click="outerClick" style="padding: 20px; background: lightgray;">
    外层
    <button @click.capture="innerClick" style="padding: 10px; background: lightblue;">
      内层按钮
    </button>
  </div>
</template>

<script>
export default {
    
  setup() {
    
    const outerClick = () => {
    
      console.log('外层被点击');
    };

    const innerClick = () => {
    
      console.log('内层按钮被点击');
    };

    return {
    
      outerClick,
      innerClick
    };
  }
}
</script>

只在事件发生在元素自身时触发

.self - 只当事件在该元素本身(而不是子元素)触发时触发回调。

<template>
  <div @click.self="divClicked" style="padding: 20px; background: lightgray;">
    点击我或我的子元素
    <button @click="buttonClicked" style="padding: 10px; background: lightblue;">
      点击子元素
    </button>
  </div>
</template>

<script>
export default {
    
  setup() {
    
    const divClicked = () => {
    
      console.log('div 被点击');
    };

    const buttonClicked = () => {
    
      console.log('按钮被点击');
    };

    return {
    
      divClicked,
      buttonClicked
    };
  }
}
</script>

只当在元素及其子元素上都没有点击事件时触发

.once - 事件将只会触发一次。

<template>
  <button @click.once="handleClick">点击我</button>
</template>

<script>
export default {
    
  setup() {
    
    let count = 0;

    const handleClick = () => {
    
      count++;
      console.log(`按钮被点击了 ${
      count} 次`);
    };

    return {
    
      handleClick
    };
  }
}
</script>

修饰键

Vue 3 还支持一些修饰键,如 .ctrl.shift.alt.meta(对应 cmdwin 键)。

<template>
  <input
    type="text"
    @keyup.enter="handleEnter"
    @keyup.ctrl.enter="handleCtrlEnter"
  />
</template>

<script>
export default {
    
  setup() {
    
    const handleEnter = () => {
    
      console.log('Enter 键被按下');
    };

    const handleCtrlEnter = () => {
    
      console.log('Ctrl + Enter 组合键被按下');
    })

   return {
    
     handleCtrlEnter
   }
 }
}
</script>

三、相关链接

  1. Vue3官方地址
  2. Vue3中文文档
  3. 「Vue3系列」Vue3简介及安装
  4. 「Vue3系列」Vue3起步/创建项目
  5. 「Vue3系列」Vue3指令
  6. 「Vue3系列」Vue3 模板语法
  7. 「Vue3系列」Vue3 条件语句/循环语句
  8. 「Vue3系列」Vue3 组件
  9. 「Vue3系列」Vue3 计算属性(computed)、监听属性(watch)
  10. 「Vue3系列」Vue3 样式绑定
相关文章
|
16天前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
13天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
31 7
|
14天前
|
前端开发 数据库
芋道框架审批流如何实现(Cloud+Vue3)
芋道框架审批流如何实现(Cloud+Vue3)
36 3
|
13天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
34 1
|
13天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
34 1
|
16天前
|
前端开发 JavaScript
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
简记 Vue3(一)—— setup、ref、reactive、toRefs、toRef
|
16天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
19天前
|
JavaScript API
vue3知识点:ref函数
vue3知识点:ref函数
29 2
|
19天前
|
API
vue3知识点:reactive函数
vue3知识点:reactive函数
24 1
|
19天前
|
JavaScript 前端开发 API
vue3知识点:Vue3.0中的响应式原理和 vue2.x的响应式
vue3知识点:Vue3.0中的响应式原理和 vue2.x的响应式
23 0