上一篇
场景引入:
小明的<ChildComponent>
里有个按钮,点击后需要通知父组件更新数据,他试过props
传函数,但代码像俄罗斯套娃一样难维护…这时隔壁程序员姐姐拍了拍他:“试试Vue自定义事件?💡”
在Vue中,父子组件通信通常有两种方式:
当子组件需要向父组件“喊话”时(“用户点击我了!”),自定义事件就是最优雅的扩音器 📢
<template> <button @click="handleClick">点我触发事件</button> </template> <script> export default { methods: { handleClick() { // 发射自定义事件(事件名, 传递的数据) this.$emit('child-click', { msg: 'Hello Parent!' }) } } } </script>
<template> <ChildComponent @child-click="handleChildEvent" /> </template> <script> export default { methods: { handleChildEvent(payload) { console.log(payload.msg) // 输出:Hello Parent! } } } </script>
💡 小技巧:事件名推荐用kebab-case
(短横线命名),因为HTML属性大小写不敏感
当监听原生DOM事件时,$event
是浏览器原生事件对象:
<button @click="handleClick($event)">点击</button> <!-- $event.target 能获取DOM元素 -->
对于自定义事件,$event
就是发射时传递的数据:
<ChildComponent @child-click="handleChildEvent($event)" /> <!-- $event { msg: 'Hello Parent!' } -->
如果需要同时获取事件对象和额外参数:
this.$emit('submit', { data: 123 }, event.target.value) // 父组件接收: handleSubmit(payload, value) { ... }
Vue的v-model
本质上是value
prop + input
事件的语法糖,我们可以用自定义事件实现类似功能:
<!-- 子组件 --> <input :value="value" @input="$emit('update', $event.target.value)"> <!-- 父组件 --> <CustomInput :value="text" @update="text = $event" />
2025年新特性:Vue 3.4+支持通过defineModel()
简化双向绑定(需启用实验性特性)
像props一样,事件也可以定义验证:
export default { emits: { // 简单验证 'no-args': null, // 完整验证 'submit': (payload) => { if (!payload.email) { console.warn('缺少email字段!') return false } return true } } }
⚠️ 注意:验证失败不会阻止事件传播,但控制台会有警告
<!-- LikeButton.vue --> <template> <button @click="onClick"> {{ count }} {{ count === 1 ? 'Like' : 'Likes' }} </button> </template> <script> export default { props: ['count'], emits: ['like'], methods: { onClick() { this.$emit('like', this.count + 1) } } } </script> <!-- 父组件使用 --> <LikeButton :count="likes" @like="likes = $event" />
Q:为什么我的自定义事件没触发?
A:检查三点→
@event-name
监听 emits
选项中意外覆盖 Q:事件能跨多级组件通信吗?
A:可以但不推荐,复杂场景建议用provide/inject
或Pinia/Vuex
:
Vue自定义事件就像组件之间的对讲机 📞 ——
$emit
发送消息 @event
接收消息 $event
传递数据或原生事件对象 emits
选项让代码更可维护 下次当你的组件需要“向上喊话”时,记得用好这个神器哦! 🚀
本文由 耿良骥 于2025-07-29发表在【云服务器提供商】,文中图片由(耿良骥)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/477584.html
发表评论