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>
```
相关推荐
铁皮饭盒4 分钟前
面试官:如何用 Bun + JS 实现安全的文件 MCP 工具集
前端·javascript·后端
探索前端34 分钟前
Cesium图层加载及影像服务添加
前端·cesium
阿懂在掘金44 分钟前
Vue 弹窗新范式——代码减少、复用翻倍与 AI 时代的前端基建
前端·设计模式·前端框架
千纸鹤安安1 小时前
Compose Runtime → KuiklyUI:Applier 搭起的渲染桥梁
前端
李明卫杭州1 小时前
mise 管理工具详解
前端·后端
颜进强1 小时前
从零搭建私人 RAG 实战:让 Claude Code 按需查询知识库
前端·后端·ai编程
程序员黑豆1 小时前
鸿蒙应用开发:Scroll 组件从入门到实战
前端·华为·harmonyos
张人玉1 小时前
基于 Vue 3 + ECharts + Express + SQLite 构建的新能源汽车销量数据分析与可视化平台——新能源汽车销量数据分析系统
数据库·vue.js·sqlite·echarts
a1117762 小时前
三色软糖坠落玻璃池 THreeJS kimi
前端·人工智能·threejs
weixin_BYSJ19872 小时前
springboot3家政平台小程序--附源码00904
java·javascript·spring boot·python·django·flask·php