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>
```
相关推荐
DFT计算杂谈2 分钟前
AMSET 设置多核并行计算
java·前端·css·html·css3
花椒技术5 分钟前
AI 协同开发落地复盘:1 小时生成首版后,为什么 Review 和修正又花了 2-3 天
前端·人工智能·架构
万少39 分钟前
万少用9个AI工具,帮朋友完成了一个"不可能"的项目
前端
小小小小宇41 分钟前
Vue `import` 为什么可以异步加载
前端
WMYeah1 小时前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
Unbelievabletobe1 小时前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
大哥,带带弟弟1 小时前
Grafana 前端嵌入与 JWT 鉴权实战
前端·grafana
小小小小宇1 小时前
前端 V8 引擎垃圾回收机制与内存问题排查
前端
前端老石人1 小时前
CSS 值定义语法
前端·css
sheeta19981 小时前
Vue 前端基础笔记
前端·vue.js·笔记