Vue跨组件通信8种方式汇总

Vue组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,所以对于Vue来说组件间的数据通信非常重要。首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易理解他们的通信方式。下图为关系说明:

Vue跨组件通信8种方式汇总_第1张图片

 如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与E是堂兄关系(非直系亲属) 针对以上关系归类为两类:

1、父子组件之间的通讯

2、非父子之间的通选(兄弟组件、堂兄组件等)

本文会介绍组件间通信的8种方式如下图目录所示:并介绍在不同的场景下如何选择有效方式实现的组件间通信方式,希望可以帮助小伙伴们更好理解组件间的通信。

 Vue跨组件通信8种方式汇总_第2张图片

 方法一:props/$emit

父组件通过props的方式向子组件传递数据,子组件通过$emit(绑定事件) 可以向父组件通信。

1、父组件向子组件传递数据

下面通过一个例子说明父组件如何向子组件传递数据:在子组件MyProduc中如何获取父组件App.vue中的数据list

示例代码: 

//App.vue中向子组件MyProduct传入数据





//components/MyProduct.vue接收




2、子组件向父组件传递数据

父: @自定义事件名="父methods函数"

子: this.$emit("自定义事件名", 传值) - 执行父methods里函数代码

$emit绑定一个自定义事件(subprice), 当这个语句被执行时, 就会将参数(index与价格)传递给父组件,父组件通过v-on监听并接收参数

示例代码

//App.vue





//components/MyProduct_sub.vue




方法二:$parent/$chidren 

vue官网API里这样描述

 Vue跨组件通信8种方式汇总_第3张图片

 示例代码:

//App.vue中

 
 
 


//son.vue


 
 

注意:得到 $parent和 $children的值不一样, $children 的值是数组,而 $parent是个对象 

 方法三:provide/inject 

类型:

provideObject | () => Object

injectArray | { [key: string]: string | Symbol | Object }

理解 :

provideinject 是vue2.2.0新增的api, 简单来说就是父组件中通过provide来提供变量, 然后再子组件中通过inject来注入变量 ,这里不论子组件嵌套有多深, 只要调用了 inject 那么就可以注入 provide中的数据

示例代码: 

//App.vue中定义变量,引入子组件

//./components/Son.vue 子组件中引入孙子组件调用父组件数据

// ./components/groundSon.vue  孙子组件中引用它爷爷的数据
 

方法四:ref/refs 

 ref如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例,可以通过实例直接调用组件的方法或访问数据

示例代码: