「Vue3系列」Vue3 事件处理

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 在 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 样式绑定
相关文章
|
1月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
131 64
|
1月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
112 60
|
6天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
25 3
|
1月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
35 8
|
1月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
32 1
|
1月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
39 1
|
1月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
1月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
41 0
|
1月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
60 0