哈喽小伙伴们!今天我们来解决Vue开发中的"世纪难题"——组件之间到底怎么传数据?就像快递小哥如何在小区里送货,看完这篇让你轻松玩转组件聊天室!( •̀ ω •́ )✧
想象乐高积木要拼接成城堡:
父组件 → 子组件:“给你一箱砖块(数据)”
子组件 → 父组件:“城墙建好了(事件反馈)”
兄弟组件:“借我个窗户(共享数据)”
适用场景:直系亲属单向送货
⚠️ 注意:props是只读的!别直接修改
适用场景:子向父发送消息
Vue3升级:推荐用defineEmits
声明事件
适用场景:需要双向绑定时
技巧:可自定义多个v-model参数
适用场景:需要直接操作子组件时
⚠️ 注意:过度使用会破坏封装性
适用场景:跨层级传递
注意:数据流向不清晰,慎用!
// 创建事件中心(Vue3需要第三方库如mitt)
import mitt from 'mitt'
const bus = mitt()
// A组件发送
bus.emit('notice', '停水通知')
// B组件接收
bus.on('notice', (msg) => {
console.log(msg) // 停水通知
})
适用场景:任意组件间通信
⚠️ 注意:容易造成事件混乱,小型项目适用
// store.js
import { defineStore } from 'pinia'
export const useStore = defineStore('main', {
state: () => ({ count: 0 })
})
// 任意组件存取
const store = useStore()
store.count++ // 所有组件同步更新!
适用场景:全局共享数据
优势:TypeScript友好,取代Vuex
适用场景:批量传递属性
注意:容易造成属性冲突
方式 | 通信方向 | 适用场景 | 复杂度 |
---|---|---|---|
Props | 父→子 | 基础数据传递 | ⭐ |
$emit | 子→父 | 事件通知 | ⭐ |
v-model | 父子双向 | 表单类组件 | ⭐⭐ |
ref | 父→子 | 调用子组件方法 | ⭐⭐ |
provide/inject | 跨层级 | 主题/配置传递 | ⭐⭐⭐ |
Event Bus | 任意组件 | 简单项目全局通知 | ⭐⭐⭐ |
Pinia | 任意组件 | 复杂状态管理 | ⭐⭐⭐⭐ |
attrs | 父→子 | 属性透传 | ⭐⭐ |
能用Props不用ref
简单项目用Event Bus
复杂状态上Pinia
透传属性要谨慎
❓ Q:兄弟组件怎么通信?
A:推荐两种方案:
❓ Q:Vue3还支持 o n / on/ on/off吗?
A:不再支持!事件总线推荐使用mitt库
官方文档:组件通信指南
交互教程:Vue School
调试工具:Vue Devtools
掌握这8种通信方式,组件之间就能畅聊无阻啦!就像组建自己的通信网络,不同的场景选择最适合的"快递方式"最重要~ 下期我们聊聊「Vue性能优化十大技巧」,敬请期待!