「Vue3系列」Vue3 事件处理

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
简介: 在 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 样式绑定
相关文章
|
8天前
|
JavaScript
Vue3中路由跳转的语法
Vue3中路由跳转的语法
111 58
|
1天前
|
存储 API
vue3中如何动态自定义创建组件并挂载
vue3中如何动态自定义创建组件并挂载
|
6天前
|
JavaScript 索引
Vue 2和Vue 3的区别以及实现原理
Vue 2 的响应式系统通过Object.defineProperty来实现,它为对象的每个属性添加 getter 和 setter,以便追踪依赖并响应数据变化。
22 9
|
8天前
|
JavaScript 开发工具
vite如何打包vue3插件为JSSDK
【9月更文挑战第10天】以下是使用 Vite 打包 Vue 3 插件为 JS SDK 的步骤:首先通过 `npm init vite-plugin-sdk --template vue` 创建 Vue 3 项目并进入项目目录 `cd vite-plugin-sdk`。接着,在 `src` 目录下创建插件文件(如 `myPlugin.js`),并在 `main.js` 中引入和使用该插件。然后,修改 `vite.config.js` 文件以配置打包选项。最后,运行 `npm run build` 进行打包,生成的 `my-plugin-sdk.js` 即为 JS SDK,可在其他项目中引入使用。
|
7天前
|
JavaScript
vue学习(10)事件修饰符
vue学习(10)事件修饰符
24 3
|
6天前
|
JavaScript 调度
Vue3 使用 Event Bus
Vue3 使用 Event Bus
11 1
|
6天前
|
JavaScript
Vue3 : ref 与 reactive
Vue3 : ref 与 reactive
9 1
vue3 reactive数据更新,视图不更新问题
vue3 reactive数据更新,视图不更新问题
|
7天前
|
JavaScript
|
7天前
vue3定义暴露一些常量
vue3定义暴露一些常量