Vue 组件通信方式可按组件关系分为几类:

  • 父子:父传子用 props,子传父用 emit 触发自定义事件;也可用 v-model(本质是 modelValue prop + update 事件的语法糖)。
  • 跨层级:provide/inject,祖先 provide 数据,后代 inject 消费。
  • 任意组件:Pinia/Vuex 等状态管理库,或事件总线(Vue3 已移除内置 $on/$off,需引入 mitt 之类的库)。
  • 特殊手段:ref 获取子组件实例直接调用方法;路由参数、URL、localStorage 等间接方式。

要点与易错点:props 是单向数据流,子组件不应直接修改 prop(对象类型虽可改属性但属于反模式)。provide/inject 默认不保证响应式,需要传入 ref/reactive 才有响应性。事件总线在小项目可用,但事件名散落难追踪,中大型项目优先用 Pinia。追问方向:v-model 的原理与多 v-model、defineExpose 与 ref 的关系、Pinia 相比 Vuex 的改进。

// 父组件
<Child :msg="text" @change="onChange" />
// 子组件
const props = defineProps(['msg'])
const emit = defineEmits(['change'])