美文网首页前端大杂烩
在 Vue 中使用 $emit 自定义事件

在 Vue 中使用 $emit 自定义事件

作者: lio_zero | 来源:发表于2022-05-24 18:23 被阅读0次

Vue $emit 允许我们从子组件向其父组件发送自定义事件。

在标准 Vue 流中,这是触发某些事件或从子组件发送数据到父组件的最佳方式。

本文详细介绍 Vue $emit

Vue $emit 是如何工作的?

每个 Vue $emit 调用可以传递两个参数:

  • 事件名称 — 这是我们可以在父组件中监听的事件名
  • 有效 payload 对象 — 我们希望跟随事件一起传递的数据(可选)
$emit('event-name', data)

在代码中使用 Vue $emit 有很多不同的方法:

  • 使用 $emit 内联
  • Options API — this.$emit
  • Composition API — context.emit
  • setup script 语法糖 defineEmits 方法

根据你的情况,每种方法都有自己的优缺点,所以让我们来看看每种方法的一个例子,你可以看到哪种方法适合你。

在 Vue 中使用 $emit 内联事件

在构建自己的自定义表单输入时,您可能希望从组件中发送数据。

<!-- CustomInput.vue -->
<template>
  <input 
    type="text"
    @change='$emit('customChange', $event.target.value)'
  />
</template>

以上存在一个问题,我们将无法监听像 @change 这样的标准输入事件。

假设我们的父组件是这样设置的,监听自定义事件 custom-change 并记录其值。

<template>
  <CustomInput @custom-change="logChange"/>
</template>

<script>
import MyInput from './components/MyInput.vue'
export default {
  components: {
    MyInput
  },
  methods: {
    logChange (event) {
      console.log(event)
    }
  }
}
</script>

为了实现这一点,我们需要自定义文本输入来侦听本地输入事件,然后发出自己的事件。

要实际传递原始更改事件的值,我们需要将带有事件有效负载的自定义事件(在此例中为 event.target.value)作为第二个参数发送。

<template>
  <input type="text" @change="$emit('customChange', $event.target.value)" />
</template>

现在,如果我们输入自定义输入,我们的父组件将正确地记录所有更改。

在 Options API 中以 $emit() 发送事件

与 Vue 3 中的几乎所有内容一样,我们可以选择使用 Options API 或 Composition API 从组件中发送自定义事件

在 Options API 中,可以使用 this 调用 $emit 方法,然后将 e.target.value 传递给它。

<script>
export default {
  methods: {
    customChange (e) {
      this.$emit('customChange', e.target.value)
    }
  }
}
</script>

使用 context.emit 在 Composition API 中发送事件

在 Composition API 中,由于安装程序在创建组件之前运行,因此我们无法访问它。

相反,我们可以使用 setup 函数的第二个参数 context 来访问 emit 方法。

context 还可以获取 soltsattr

两种获取方法:

  • 使用 setup 获取整个 context 对象
  • 仅通过解构 context 获取 emit

我们可以调用与 Options API 完全相同的 emit:创建一个方法,调用 emit,并将参数传递给它!

<script>
export default {
  setup (props, { emit }) {
    const customChange = (e) => {
      emit('customChange', e.target.value)
    }

    return {
      customChange
    }
  }
}
</script>

以上就是 Vue `emit()` 方法发送自定义事件的三种不同方法。

## setup 语法糖

`setup script` 可以通过 `defineEmits` 方法定义 emit 自定义事件。

```vue
<script setup>
  const emit = defineEmits(['customChange'])
  const handleAPI = (e) => {
    emit('customChange', e.target.value)
  }
</script>

监听事件时使用 kebab-case

Vue 官方文档建议在事件名称中使用 kebab-case,即使是在脚本中。如果您使用的是 Vue 2,这一点至关重要

在 Vue2 中,事件名称没有自动将 camelCase 转换为 kebab-casev-on 指令会自动将事件名称转换为小写,因此 camelCase 命名的事件不可能被监听。

例如,如果我们发出一个名为 myEvent 的事件,则侦听 my-event 将不起作用

在 Vue3 中,事件名称(如 propscomponents)可以在不同情况下自动转换。与 props 类似,最好还是坚持每种编程语言的约,在脚本中使用 camelCase,在模板中使用 kebab-case

相关文章

  • 在 Vue 中使用 $emit 自定义事件

    Vue $emit 允许我们从子组件向其父组件发送自定义事件。 在标准 Vue 流中,这是触发某些事件或从子组件发...

  • Vue父子组件通信之$emit(基于vue2.5,ES6)

    一、$emit的作用 在Vue中,父组件监听子组件触发的事件,需要在子组件用使用 $emit 触发,在父组件中使用...

  • 抛出自定义事件

    vue3使用emit分发事件,类似于$emit,从setup的第二个参数中解构出emit

  • 2018-07-02

    vue中自定义事件很容易用于子父组件通信,如子组件中 this.emit('from-child',data),在...

  • vue组件的使用

    props和$emit 组件间通讯和自定义事件 父子通讯 props $emit兄弟组件或者隔代组件使用自定义事件...

  • Vue中事件发射emit以及事件响应on的实现

    事件机制是Vue中重要的通信机制,这里看下源码简单说明下Vue事件emit和on的实现: $on和$emit函数的...

  • VUE 爬坑笔记 (4)

    兄弟组件之间传值 创建一个空的vue实例,作为事件总线 在数据源位置使用这个vue实例的$emit方法自定义一个事...

  • 理解Vue中的.native修饰符

    个人理解,如果有误请指正。 在书《Vue.js 实战》一书中,作者先讲到了自定义事件这一知识点,然后使用$emit...

  • $emit()

    vue 为每个组件对象提供了一个内置方法 $emit ,它等同于自定义事件中的 new Event,trigger...

  • 关于vue中发布-订阅模式的原理浅析

    作为一个vue开发者,在学习和使用vue的过程中都会接触到自定义事件,其中两个方法就是$on和$emit,接下来通...

网友评论

    本文标题:在 Vue 中使用 $emit 自定义事件

    本文链接:https://www.haomeiwen.com/subject/rlyvtrtx.html