vue3 组合式API defineEmits() 与 emits 组件选项

defineEmits()emits组件选项在功能上都是用于声明组件可以向外触发的事件。它们的核心目的都是让组件明确地告知外界它能够发出哪些自定义事件,以此来规范组件间的通信。

defineEmits()在 Vue 3 的组合式 API 中使用。
emits组件选项 在Vue 2 及 Vue 3 的选项式 API 中使用。

defineEmits()

defineEmits()用于声明由组件触发的自定义事件。

可以以两种形式声明触发的事件:

  • 使用字符串数组的简易形式。
  • 使用对象的完整形式。该对象的每个属性键是事件的名称,值是 null 或一个验证函数。
    • 验证函数应返回布尔值,以表明事件参数是否通过了验证。

字符串数组语法:

html 复制代码
<script setup>
const emit = defineEmits(['increment', 'decrement']);
</script>

defineEmits接收一个字符串数组['increment', 'decrement'],这意味着在该组件内部可以通过emit('increment')emit('decrement')来触发incrementdecrement这两个事件。

对象语法:

html 复制代码
<script setup>
const emit = defineEmits({
    updateCount: (newCount) => {
        return typeof newCount === 'number';
    }
});
</script>

defineEmits接收一个对象,对象的键updateCount是事件名称,值是一个验证函数(newCount) => { return typeof newCount === 'number'; }。当在组件内部调用emit('updateCount', value)时,这个验证函数会检查传递的value是否为数字类型,如果不是,Vue 会在开发环境下给出警告。

defineEmits函数的返回值是一个函数,通常命名为emitemit可以在子组件中触发自定义事件。当子组件需要向父组件传递数据或通知父组件发生了某些事情时,可以使用emit函数触发相应的自定义事件。

示例

子组件ChildComponent.vue

html 复制代码
<!-- ChildComponent.vue -->
<template>
  <h2>ChildComponent的标题</h2>
  <div>ChildComponent的内容</div>
  <div>count: {{ count }}</div>
  <div>在ChildComponent中展示customValue的值:{{ attrs.customValue }}</div>
  <button @click="changeCount">修改count 并 赋值给 父组件的 customValue</button>
</template>
<script setup lang="ts">
import { ref, useAttrs } from 'vue';
let attrs = useAttrs();
let count = ref(1);

const emit = defineEmits({
  updateCustomValue: count => {
    return typeof count.value == 'number';
  }
});

const changeCount = () => {
  count.value++
  emit('updateCustomValue', count.value);
};
</script>

在父组件中使用ChildComponent.vue

html 复制代码
<template>
  <div class="home-wrap">
    <h1>父组件</h1>

    <ChildComponent
      class="child-div"
      :customValue="customValue"
      @updateCustomValue="updateCustomValue"
    />
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const customValue = ref(10);
const updateCustomValue = ($event: number) => {
  console.log($event);
  customValue.value = $event;
};
</script>

如果将子组件的count 属性声明为字符串count = ref('hello world'),点击按钮,调用emit('updateCustomValue', count.value);,字符串hello world 会被赋值给 customValue

浏览器控制台报错:

Invalid event arguments: event validation failed for event "updateCustomValue".

无效的事件参数:事件"updateCustomValue"验证失败。

emits组件选项

emits用于声明由组件触发的自定义事件。

可以以两种形式声明触发的事件:

  • 使用字符串数组的简易形式。
  • 使用对象的完整形式。该对象的每个属性键是事件的名称,值是 null 或一个验证函数。
    • 验证函数会接收到传递给组件的 $emit 调用的额外参数。例如,如果 this.$emit('foo', 1) 被调用,foo 相应的验证函数将接受参数 1
    • 验证函数应返回布尔值,以表明事件参数是否通过了验证。

字符串数组语法:

javascript 复制代码
export default {
  emits: ['customEvent1', 'customEvent2']
};

emits是一个组件选项,它是一个字符串数组,其中customEvent1customEvent2是这个组件可以触发的两个自定义事件。在组件的方法中,可以通过this.$emit('customEvent1', data)来触发customEvent1事件,并传递相关数据data

对象语法:

typescript 复制代码
export default {
  emits: {
   customEvent: (payload) => {
     // 验证逻辑,例如检查 payload 的类型或值
     return payload > 0;
   }
  }
};

emits是一个对象,customEvent是事件名称,其对应的值是一个验证函数。当在组件内部通过this.$emit('customEvent', value)触发事件时,这个验证函数会检查传递的value是否符合条件(这里是value > 0)。如果不符合,Vue 会在开发环境下发出警告。

相关推荐
LJ小番茄11 分钟前
Vue 常见的几种通信方式(总结)
前端·javascript·vue.js·html
黑狼传说15 分钟前
前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
前端·性能优化
장숙혜21 分钟前
前端-CDN的理解及CDN一些使用平台
前端
customer0829 分钟前
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
FakeOccupational2 小时前
nodejs 007:错误npm error Error: EPERM: operation not permitted, symlink
前端·npm·node.js
奶糖 肥晨2 小时前
react是什么?
前端·react.js·前端框架
亦舒.2 小时前
JSDelivr & NPM CDN 国内加速节点
前端·npm·node.js
代码搬运媛2 小时前
code eintegrity npm err sha512
前端·npm·node.js
阳光开朗_大男孩儿2 小时前
DBUS属性原理
linux·服务器·前端·数据库·qt
pan_junbiao3 小时前
Vue组件:模板引用ref属性的使用
前端·javascript·vue.js