相关推荐recommended
Vue3 组件之间的通信
作者:mmseoamin日期:2023-12-02

组件之间的通信

经过前面几章的阅读,相信开发者已经可以搭建一个基础的 Vue 3 项目了!

但实际业务开发过程中,还会遇到一些组件之间的通信问题,父子组件通信、兄弟组件通信、爷孙组件通信,还有一些全局通信的场景。

TIP
这一章节的内容,Vue 3 对比 Vue 2 的变化都比较大!

这一章就按使用场景来划分对应的章节吧,在什么场景下遇到问题,也方便快速找到对应的处理办法。

父子组件通信

爷孙组件通信

兄弟组件通信

全局组件通信

父子组件通信

父子组件通信是指,B 组件引入到 A 组件里渲染,此时 A 是 B 的父级;B 组件的一些数据需要从 A 组件拿,B 组件有时也要告知 A 组件一些数据变化情况。

他们之间的关系如下, Child.vue 是直接挂载在 Father.vue 下面:

# 父组件
Father.vue
│ # 子组件
└─Child.vue

常用的方法有:

Vue3 组件之间的通信,在这里插入图片描述,第1张

为了方便阅读,下面的父组件统一叫 Father.vue ,子组件统一叫 Child.vue 。

WARNING
在 Vue 2 ,有的开发者可能喜欢用 $attrs / $listeners 来进行通信,但该方案在 Vue 3 已经移除了,详见 移除 $listeners 。

props / emits

这是 Vue 跨组件通信最常用,也是基础的一个方案,它的通信过程是:

1.父组件 Father.vue 通过 props 向子组件 Child.vue 传值

2.子组件 Child.vue 则可以通过 emits 向父组件 Father.vue 发起事件通知

最常见的场景就是统一在父组件发起 AJAX 请求,拿到数据后,再根据子组件的渲染需要传递不同的 props 给不同的子组件使用。

下发 props

注:这一小节的步骤是在 Father.vue 里操作。

下发的过程是在 Father.vue 里完成的,父组件在向子组件下发 props 之前,需要导入子组件并启用它作为自身的模板,然后在 setup 里处理好数据并 return 给 用。

在 Father.vue 的 script /> 里:

// Father.vue
import { defineComponent } from 'vue'
import Child from '@cp/Child.vue'
interface Member {
  id: number
  name: string
}
export default defineComponent({
  // 需要启用子组件作为模板
  components: {
    Child,
  },
  // 定义一些数据并 `return` 给 `