Vue 组件间通信的方式有哪些?
介绍了多种 Vue 组件间通信的方式及其使用场景,包括 Props、Custom Events、Event Bus 等。
Vue 组件间通信的常见方式包括多种途径,适应不同组件的层级关系和场景需求:
- Props / Attributes(父组件传子组件)
父组件通过 HTML 属性方式向子组件传递数据。子组件需在props
选项中定义接收项,数据是单向数据流,子组件不能直接修改。
示例代码:<!-- 父组件 --> <template> <ChildComponent :message="parentMsg" /> </template> <!-- 子组件 --> <script> export default { props: ('message') } </script>
- Custom Events / $emit(子组件传父组件)
子组件通过this.$emit('事件名', payload)
触发自定义事件。父组件使用v-on
(或@
)侦听事件并更新数据,实现反传数据。
示例代码:<!-- 子组件 --> <template> <button @click="$emit('update', 'New Value')">Update</button> </template> <!-- 父组件 --> <template> <Child @update="handleUpdate" /> </template>
-
Event Bus / 事件总线(任意组件间通信)
基于一个共享的 Vue 实例(如const bus = new Vue()
),任何组件都可调用bus.$emit('event')
广播事件并通过bus.$on('event', callback)
监听接收。此方式灵活适用于同级或跨层通信。 -
Vuex(状态管理库)
用于复杂应用中的全局状态共享。组件通过store.state
访问数据,触发commit
(mutations)或dispatch
(actions)更新状态并响应变化,实现高度统一的状态管理。
关键机制包括state
,mutations
,actions
,getters
。 -
Attrs/Listeners(深层次传参支持)
$attrs
允许父组件传递未识别的属性至子组件;$listeners
则用于事件监听绑定。常用于多级组件嵌套场景。 -
Provide/Inject(跨级依赖注入)
祖先组件通过provide
提供数据后,子孙组件无需逐层传递即可通过inject
注入访问数据。Vue3 对其进行了改进以支持依赖控制。 -
访问实例: $parent/$children(非推荐方法)
此方式允许通过this.$parent
访问父实例或this.$children
索引子组件,但不适用于Vue3 Composition API 和大型项目中,因其耦合性和维护代价较高。 - 其他技术
Refs 可用于获取组件实例后进行通信 (如$refs
)。 Session Storage / Local Storage + Vuex 可用于刷新时状态持久化处理。