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

vue3中 组合式~测试深入组件:事件 与 $emit()—setup() 上下文对象ctx.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>

相关文章:

  • 前端文件加载耗时过长解决方案
  • 网络安全等级保护—定级
  • DeepSeek 3FS:端到端无缓存的存储新范式
  • Docker运行hello-world镜像失败或超时:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi
  • 安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源
  • 利用50张可视化动图理解Mamba与状态空间模型
  • slam学习笔记9---ubuntu2004部署interactive_slam踩坑记录
  • 最新版本TOMCAT+IntelliJ IDEA+MAVEN项目创建(JAVAWEB)
  • Android MVI架构模式详解
  • Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)
  • 嵌入式硬件设计SPI时需要注意什么?
  • Spring中的事务管理是如何实现的?
  • 信奥赛CSP-J复赛集训(模拟算法专题)(1):P8813 [CSP-J 2022] 乘方
  • 从零开始学机器学习——什么是机器学习
  • 安卓音频框架混音器
  • java泛型(详细)
  • Vue 系列之:组件通讯
  • Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念
  • CS144 Lab Checkpoint 2: the TCP receiver
  • 【哇! C++】类和对象(三) - 构造函数和析构函数
  • 建设网站都要学些什么问题/制作网站代码
  • 网站开发实训教程/没干过网络推广能干吗
  • 企业网站需要什么/今日头条新闻最新
  • 怎样利用网站做推广/东莞头条最新新闻
  • 网站设置在哪里找到/seo云优化平台
  • 高端网站建设专家/阿里指数数据分析平台