组件通信由前端框架实现,Vue 3 用 props/$emit/v-model 实现父子通信,React 用 props/回调函数/受控组件;兄弟组件需通过父组件或状态管理(Pinia/Zustand)协调;跨层级可用 provide/inject 或 Context。

JavaScript 本身不直接处理组件通信,真正实现组件通信的是前端框架(如 Vue、React)。原生 JavaScript 没有“组件”概念,但现代开发中常说的“组件通信”默认指 Vue 或 React 中的实践。下面以 Vue 3(组合式 API) 和 React 18(函数组件 + Hooks) 为主,说明父子、兄弟组件传值的核心方式,语言简洁、直击关键。
父子组件通信:父传子用 props,子传父用事件
Vue 3 示例:
- 父组件通过 props 向子组件传数据(响应式);子组件用 defineProps 声明接收
- 子组件通过 $emit 触发自定义事件,父组件用 @事件名 监听并接收参数
- 推荐使用 v-model 简化双向绑定(本质是 props + emit 的语法糖)
React 示例:
- 父组件通过 props 传数据或函数给子组件
- 子组件调用父传来的函数(如 onUpdate),把值作为参数传回,实现“子→父”通信
- 受控组件模式(如 value + onChange)是标准做法,避免子组件自己维护状态
兄弟组件通信:绕过彼此,共用父组件或状态管理
兄弟组件没有直接引用关系,不能互相调用方法或读取状态。必须借助“中间人”:
立即学习“Java免费学习笔记(深入)”;
- Vue:父组件做桥梁——一个兄弟通过事件通知父,父再通过 props 转发给另一个兄弟;或使用 provide/inject(适合跨多层,但非响应式需配合 ref)
- React:提升状态到共同父组件(Lifting State Up),由父统一管理共享数据,并分发给两个兄弟;也可用 useContext 创建全局状态上下文(轻量级状态共享)
- 复杂场景建议用 Pinia(Vue) 或 Redux Toolkit / Zustand(React),避免层层透传
不推荐但偶见的方式:事件总线或全局状态(慎用)
过去有人用 EventBus(Vue 2) 或 CustomEvent(原生) 实现任意组件通信,现在已不推荐:
- 难以追踪数据流向,调试困难
- 容易内存泄漏(监听未及时移除)
- 破坏组件封装性,耦合变隐式
- Vue 3 废弃了全局事件总线,React 也没有官方支持
小技巧:跨层级通信可考虑 provide/inject(Vue)或 Context(React)
不是所有跨级都得靠 props 一层层传:
- Vue 的 provide/inject:祖先组件 provide 响应式数据(用 ref 或 computed),后代用 inject 获取,适合配置类、主题、API 实例等
- React 的 Context:用 createContext + Provider + useContext,适合用户登录态、语言偏好等低频更新的全局状态
- 注意:二者都不适合高频更新的状态(会引发不必要的重渲染),此时仍推荐状态管理库










