咪咕云书店app
177.47MB · 2025-10-09
在 Vue 中,组件(Component) 是最核心的概念之一。每个 .vue
文件都可以视为一个独立的组件。
而 通信(Communication) 是指一个组件如何将信息传递给另一个组件。
通俗地说:
例如:当我们使用 UI 框架中的 table
组件时,需要向它传入 data
数据,这个“传值”的过程本质上就是一种组件通信。
在实际开发中,每个组件都有自己的作用域,数据默认是相互隔离的。但我们经常希望:
这正是组件通信的意义所在:
按照组件关系,通信可分为以下几种:
简单关系图如下:
Parent
├── Child A
└── Child B
└── GrandChild
下面是 Vue2 / Vue3 通用的 8 种通信方式,并在最后补充两者的区别。
适用场景: 父组件向子组件传值。
子组件定义:
export default {
props: {
name: String,
age: {
type: Number,
default: 18,
required: true
}
}
}
父组件使用:
<Child name="Jack" :age="18" />
Vue3 区别:
Vue3 支持在 <script setup>
中使用 defineProps
:
const props = defineProps({
name: String,
age: Number
})
适用场景: 子组件向父组件传递数据或事件。
子组件:
this.$emit('add', good)
父组件:
<Child @add="cartAdd($event)" />
Vue3 区别:
Vue3 使用 defineEmits
:
const emit = defineEmits(['add'])
emit('add', good)
适用场景: 父组件想直接访问子组件实例或方法。
父组件:
<Child ref="foo" />
this.$refs.foo.someMethod()
Vue3 区别:
Vue3 的 ref
通过 setup
中的 ref()
引用,访问方式为 childRef.value
。
适用场景: 兄弟组件之间传值。
Bus.js:
import Vue from 'vue'
export const Bus = new Vue()
发送方:
Bus.$emit('foo', data)
接收方:
Bus.$on('foo', (data) => { console.log(data) })
Vue3 区别:
Vue3 没有 $on/$off
,可用第三方库(如 mitt)实现轻量事件总线:
import mitt from 'mitt'
export const bus = mitt()
bus.emit('foo', data)
bus.on('foo', handler)
适用场景: 通过组件实例树访问父组件或根组件方法。
this.$parent.someMethod()
this.$root.globalFn()
Vue3 区别:
仍可用,但在 Composition API 下不推荐,应优先使用 provide/inject
。
适用场景: 批量向下传递属性与事件。
<!-- Parent.vue -->
<Child2 msg="hello" @some-event="handleEvent" />
<!-- Child2.vue -->
<Grandson v-bind="$attrs" v-on="$listeners" />
<!-- Grandson.vue -->
<div @click="$emit('some-event', 'from grandson')">
{{ msg }}
</div>
Vue3 区别:
Vue3 将 $listeners
合并入 $attrs
,事件监听器自动包含其中:
<Grandson v-bind="$attrs" />
适用场景: 祖先组件向任意深度的后代组件传递数据。
祖先组件:
provide() {
return {
foo: 'foo'
}
}
后代组件:
inject: ['foo']
Vue3 区别:
Vue3 使用 Composition API:
// 祖先
import { provide } from 'vue'
provide('foo', 'foo')
// 后代
import { inject } from 'vue'
const foo = inject('foo')
适用场景: 复杂组件关系、跨层级状态共享。
Vuex 核心概念:
state
:存放共享状态;getters
:相当于计算属性;mutations
:同步修改 state;actions
:支持异步逻辑;modules
:模块化管理。 Vue3 推荐:
Vue 官方推荐使用 Pinia,API 更简洁、类型友好。
关系类型 | 推荐通信方式 | 说明 |
---|---|---|
父 → 子 | props | 简单直接 |
子 → 父 | $emit | 常用于回调 |
父 ↔ 子 | ref | 调用方法或取值 |
兄弟组件 | EventBus / mitt | 中央事件总线 |
祖孙组件 | provide / inject | 优雅高效 |
非关系组件 | Vuex / Pinia | 全局状态共享 |
属性透传 | $attrs / $listeners | 批量下传属性 |
简单共享状态 | Composition API + reactive() | Vue3 场景 |
props
和 $emit
最简洁,也可用 ref
。EventBus
或 mitt
。provide / inject
最优雅。Vuex
(Vue2)或 Pinia
(Vue3)。总结一句话:
本文内容由人工智能生成,仅供学习与参考使用,请在实际应用中结合自身情况进行判断。