当前位置: 首页 > news >正文

vue3中 组合式~测试深入组件:事件 与 $emit()

一、语法(props)

第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件,

<!-- MyComponent -->
<button @click="$emit('someEvent')">Click Me</button>

第二步父组件可以通过 v-on (缩写为 @) 来监听事件:

<MyComponent @some-event="callback" />

//组件的事件监听器也支持 .once 修饰符:
<MyComponent @some-event.once="callback" />
注意:

1.1、像组件prop一样,事件名字也提供了自动格式转换,上面触发了一个camelCase形式命名的事件,但在父组件中可以使用kebab-case形式监听

1.2、和原生 DOM 事件不一样,组件触发的事件没有冒泡机制。你只能监听直接子组件触发的事件。平级组件或是跨越多层嵌套的组件间通信,应使用一个外部的事件总线,或是使用一个全局状态管理方案(vuex)。

二、事件参数

// 子组件
<button @click="$emit('increaseBy', 1)">
  Increase by 1
</button>

// 父组件:
// 第一种:可以先简单写一个内联的箭头函数作为监听器,此函数会接收到事件附带的参数;
<MyButton @increase-by="(n) => count += n" />


// 第二种:还可以用一个组件方法来作为事件处理函数:
<MyButton @increase-by="increaseCount" />
function increaseCount(n) {
  count.value += n
}
注意:

       所有传入 $emit() 的额外参数都会被直接传向监听器。举例来说,$emit('foo', 1, 2, 3) 触发后,监听器函数将会收到这三个参数值。

二、声明触发事件

组件可以显式地通过 defineEmits() 宏来声明它要触发的事件:

<script setup>
    defineEmits(['inFocus', 'submit'])
</script>
注意:

      1. 我们在 <template> 中使用的 $emit 方法不能在组件的 <script setup> 部分中使用,但 defineEmits() 会返回一个相同作用的函数供我们使用:

<script setup>
const emit = defineEmits(['inFocus', 'submit'])

function buttonClick() {
  emit('submit')
}
</script>

        2. defineEmits() 宏不能再子函数中使用,必须在<script setup>的顶级作用域下

        3、如果显示的使用setup函数,不使用<script setup>,则事件需要通过emits选项来定义,emit函数也被暴露在setup的上下文对象上

export default {
  emits: ['inFocus', 'submit'],
  setup(props, ctx) {
    ctx.emit('submit')
  }
}

  3、emits 选项和 defineEmits() 宏还支持对象语法

四、事件校验

        和对 props 添加类型校验的方式类似,所有触发的事件可以使用对象形式描述

        要为事件添加校验,那么事件可以被赋值为一个函数,接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

<script setup>
const emit = defineEmits({
  // 没有校验
  click: null,

  // 校验 submit 事件
  submit: ({ email, password }) => {
    if (email && password) {
      return true
    } else {
      console.warn('Invalid submit event payload!')
      return false
    }
  }
})

function submitForm(email, password) {
  emit('submit', { email, password })
}
</script>

相关文章:

  • C#:LINQ学习笔记01:LINQ基础概念
  • 品佳诚邀您参加 3/12『英飞凌汽车方案引领智能座舱新纪元』在线研讨会
  • Ubuntu问题 - 在ubuntu上使用 telnet 测试远程的IP:端口是否连通
  • 软考-数据库开发工程师-3.1-数据结构-线性结构
  • 为什么要学习数据结构与算法
  • 修改hosts文件,修改安全属性,建立自己的DNS
  • 如何判断https使用了哪个版本的TLS?
  • 创建 Ubuntu 22.04 USB 启动盘
  • 游戏引擎学习第135天
  • 【RTC】 TM32 RTC(实时时钟)库函数 配置
  • 图生生AI,如何将商品主图的商品替换成自己的商品?
  • CF 452A.Eevee(Java实现)
  • 操作 Redis 常用 shell 脚本
  • 获取哔站评论
  • 【JavaScript — 前端快速入门】 JavaScript 引入方式
  • 全向广播扬声器在油气田中的关键应用 全方位守护安全
  • 充电桩测试负载应用:保障充电安全与性能的核心技术
  • SpringBoot获取YAML配置文件中的属性值(二):使用Environment环境组件读取值
  • 非docker方式部署openwebui过程记录
  • 【MySQL】事务二
  • 快速构建网站/论坛如何做seo
  • 网站推广的基本手段/什么叫seo
  • 页面做的好看的网站/郑州网络营销排名
  • 文章类型网站/郑州seo哪家好
  • 网站搜索功能怎样做/神马推广
  • 杭州网站建设电话/排名前十的大学