# Vue2父子通信方式大全
**Repository Path**: szxio/vue2communications
## Basic Information
- **Project Name**: Vue2父子通信方式大全
- **Description**: 演示了几种vue2中的父子组件通信的几种方式,涵盖了开发中常用的几种方法
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-08-10
- **Last Updated**: 2023-09-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Vue
## README
## Vue2父子传参:props
首先在父组件中引入子组件,然后以属性的方式将数据传递给子组件
父组件:
```vue
```
然后在子组件中使用props接收,props里定义的名字要和父组件定义的一致
子组件:
```vue
{{ msg }}
```
## Vue2父子传参之父传子:$refs
在父组件中给子组件的标签上添加 ref 等于一个变量,然后通过使用 $refs 可以获取子组件的实例,以及调用子组件的方法和传递参数
父组件:
```vue
```
然后在子组件中定义相同的方法名,在父组件使用 `$refs` 调用后或触发在子组件定义的方法
子组件:
```vue
```
## Vue2父子传参之子传父:$emit
在子组件中我们也可以调用父组件的方法向父组件传递参数,通过`$emit`来实现
子组件:
```vue
```
然后在父组件中定义并绑定子组件传递的 `setValueName` 事件,事件名称要和子组件定义的名称一样
父组件:
```vue
```
## Vue2父子传参:parent/children
- 父组件通过`$children`获取子组件的实例数组
- 子组件通过`$parent`获取的父组件实例
父组件中可以存在多个子组件,所以`this.$children`获取到的是子组件的数组
父组件:
```vue
```
子组件:
```vue
```
## Vue2兄弟传参:bus.js
首先新建 `bus.js` 文件,初始化如下代码:
```js
import Vue from 'vue'
export default new Vue()
```
然后在需要通信的组件中都引入该 `bus` 文件,其中一个文件用来发送,一个文件监听接收。派发事件使用 `bus.$emit`。
下面组件派发了一个叫`setYoungerBrotherData`的事件
```vue
哥哥组件:
```
在另一个页面中使用 `bus.$on('setYoungerBrotherData',()=>{})` 监听
```vue
弟弟组件:{{ msg }}
```
## Vue2跨级传参:provide/inject
`provide`和`inject`是`vue`生命周期上的两个函数,这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。
提示:`provide` 和 `inject` 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。
祖先组件:
```vue
```
孙子组件:
```vue
{{ bar }}
```
使用 `provide/inject`的好处是父组件不需要知道是哪个自组件使用了我的数据,子组件也不需要关心数据从何而来
## 总结
- 父子通信:父向子传递数据通过`props`,子向父传递数据通过`$emit`事件,父链子链使用`$parent/$children`,直接访问子组件实例使用`$refs`
- 兄弟通信:`bus,Vuex`
- 跨级通信:`bus,Vuex,provide/inject`