Vue3 事件处理指南:发出自定义事件

2022-10-2421:12:03WEB前端开发Comments1,472 views字数 3189阅读模式

Vue事件处理是每个Vue项目必不可少的一部分,包括捕获用户输入、共享数据以及其他许多创造性的方式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

本文在介绍基础知识的同时,还将提供一些处理事件的代码示例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

基本事件处理

使用v-on指令(简写为@),我们可以监听DOM事件并运行处理程序方法或内联JavaScript代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<div v-on:click="handleClick" /><div @click="handleClick" />

发出自定义事件

web框架中的一个常见用例是希望子组件能够向其父组件发出事件。意味着允许双向数据绑定。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

其中一个示例是将数据从输入组件发送到父表单。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

根据使用的是Options API还是Composition API,发出事件的语法是不同的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

在Options API中,我们可以直接调用this.$emit(eventName, payload)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

组件示例如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

Options API文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

export default {  methods: {    handleUpdate: () => {      this.$emit("update", "Hello World");    },  },};

但是,Composition API有不同的this引用。所以,我们可以使用Vue3 setup方法直接访问emit方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

setup方法的第二个参数是上下文变量,它包含三个属性:attrsslots,以及对我们来说最重要的emit文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

只要导入上下文对象,我们就可以通过与Options API相同的参数调用emit文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

Composition API文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

export default {  setup(props, context) {    const handleUpdate = () => {      context.emit("update", "Hello World");    };    return { handleUpdate };  },};

有一种整理代码的方法是使用对象解构直接导入emit。如下所示。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

对象解构的简写方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

export default {  setup(props, { emit }) {    const handleUpdate = () => {      emit("update", "Hello World");    };    return { handleUpdate };  },};

非常出色。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

无论我们使用的是Options还是Composition API,父组件都以相同的方式监听事件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<HelloWorld @update=inputUpdated/>

如果发出的方法也传递了一个值,那么我们可以通过两种不同的方式进行捕获——取决于是内联还是使用其他方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

首先,我们可以在模板中使用$event访问传递的值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<HelloWorld @update="inputUpdated($event)" />

其次,如果我们使用方法来处理事件,传递的值将自动作为第一个参数传递给方法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<template>  <HelloWorld @update="inputUpdated" />  <template>    <script>      // ...      methods: {       inputUpdated: (value) => {        console.log(value) // WORKS TOO       }      }    </script></template  ></template>

处理鼠标事件修饰符

以下是我们可以在v-on指令中捕获的主要DOM鼠标事件列表:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<div   @mousedown=handleEvent  @mouseup=handleEvent  @click=handleEvent  @dblclick=handleEvent  @mousemove=handleEvent  @mouseover=handleEvent  @mousewheel=handleEvent  @mouseout=handleEvent>Interact with Me!</div>

对于点击事件,我们还可以添加鼠标事件修饰符来限制哪些鼠标按钮会触发事件。有三个事件(每个按钮一个):leftrightmiddle文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<!-- This will only trigger for the left mouse click --><div @mousedown.left=handleLeftClick> Left </div>

键盘事件修饰符

我们可以监听三个DOM键盘事件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<input   type=text   placeholder=Type something   @keypress=handleKeyPressed   @keydown=handleKeyDown   @keyup=handleKeyUp/>

通常,如果我们想在某个键上检测这些事件,有两种方法可以做到这一点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

  • 键码
  • Vue对于某些键的别名(entertabdeleteescspaceupdownleftright
<!-- Trigger even when enter is released --><input   type=text   placeholder=Type something   @keyup.enter=handleEnter/><!-- OR --><input   type=text   placeholder=Type something   @keyup.13=handleEnter/>

系统修饰符

对于某些项目,我们可能只想在用户按下修饰符键时才触发事件。修饰符键有点类似于commandshift文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

在Vue中,有四个系统修饰符。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

  • shift
  • alt
  • ctrl
  • meta(mac上是cmd,windows上是windows键)

这在Vue应用程序中创建自定义键盘快捷键等功能时非常有用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<!-- Custom Shortcut that creates a list for Shift + 8 --><input   type=text   placeholder=Type something   @keyup.shift.56=createList/>

浏览Vue文档,我们发现还有一个exact修饰符,用于确保只有当我们指定的键被按下时才会触发事件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<!-- Custom Shortcut that creates a list for Shift + 8 ONLY --><input   type=text   placeholder=Type something   @keyup.shift.56.exact=createList/>

事件修饰符

对于所有DOM事件,我们可以使用修饰符来改变其运行方式。无论是停止传播还是阻止默认操作,Vue皆有相应的内置DOM事件修饰符。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

<!-- Prevent Default Action --><form @submit.prevent><!-- Stop Event Propagation --><form @submit.stop=submitForm><!-- Easy to Join Modifiers --><form @submit.stop.prevent=submitForm><!-- Prevent event from being triggered more than once --><div @close.once=handleClose>

总结

希望这份简短的备忘单能帮助大家更好地了解Vue事件处理。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/29792.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/gcs/29792.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定