vue3-深入组件-事件

触发与监听事件

在组件的模板表达式中,可以直接使用 $emit 方法触发自定义事件。

定义与使用格式规范:

camelCase(小驼峰命名形式)比如:changeStatus

复制代码
<!-- MyComponent -->
<button @click="$emit('changeStatus')">click me</button>

在父组件中使用 kebab-case 形式使用

复制代码
<MyComponent @change-status="callback" />

同样,组件的事件监听器也支持 .once 修饰符:

复制代码
<MyComponent @some-event.once="callback" />

和原生 DOM 事件不一样,组件触发的事件没有冒泡机制。你只能监听直接子组件触发的事件。

平级组件或是跨越多层嵌套的组件间通信

  • 应使用一个外部的事件总线

  • 或是使用一个全局状态管理方案。

事件参数

有时候我们会需要在触发事件时附带一个特定的值。

定义一个子组件,传参数为 1

复制代码
<!-- MyButton -->
<button @click="$emit('addNum', 1)">
  Increase by 1
</button>

父组件使用内联的箭头函数监听

复制代码
<MyButton @add-num="(n) => count += n" />

父组件也可使用组件方法来作为事件处理函数:

复制代码
<MyButton @add-num="addNum" />

function addNum(n) {
  count.value += n
}

所有传入 $emit() 的额外参数都会被直接传向监听器。

声明触发的事件

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

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

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

尽管事件声明是可选的,我们还是推荐你完整地声明所有要触发的事件,以此在代码中作为文档记录组件的用法。
如果一个原生事件的名字 (例如 click) 被定义在 emits 选项中,则监听器只会监听组件触发的 click 事件而不会再响应原生的 click 事件。

事件校验

和对 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>
```
相关推荐
卤代烃12 分钟前
🦾 可为与不可为:CDP 视角下的 Browser 控制边界
前端·人工智能·浏览器
_XU26 分钟前
AI工具如何重塑我的开发日常
前端·人工智能·深度学习
C_心欲无痕42 分钟前
vue3 - defineExpose暴露给父组件属性和方法
前端·javascript·vue.js·vue3
鹿人戛1 小时前
HarmonyOS应用开发:相机预览花屏问题解决案例
android·前端·harmonyos
萌萌哒草头将军1 小时前
绿联云 NAS 安装 AudioDock 详细教程
前端·docker·容器
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue宠物医院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
贺今宵1 小时前
安装better-sqlite3报错electron-vite
javascript·sql·sqlite·sqlite3
GIS之路2 小时前
GIS 数据转换:使用 GDAL 将 GeoJSON 转换为 Shp 数据
前端
2501_944446002 小时前
Flutter&OpenHarmony文件夹管理功能实现
android·javascript·flutter
朴shu2 小时前
Luckysheet 远程搜索下拉 控件开发 : 揭秘二开全流程
前端