![d21284829c6f0d1b03429cf30e311bc8.png](https://img-blog.csdnimg.cn/img_convert/d21284829c6f0d1b03429cf30e311bc8.png)
组件间通信常见的几种情况
一、父组件到子组件
二、子组件到父组件
三、跨级组件
四、非嵌套组件
![2318b856d9b3f789b6e9f4d6ef168d18.png](https://img-blog.csdnimg.cn/img_convert/2318b856d9b3f789b6e9f4d6ef168d18.png)
1)父组件到子组件:通常父组件使用props向子组件传递,然后子组件处理
父组件Parent.js
![b7f40a8e0939a366f3b54583ba180f3f.png](https://img-blog.csdnimg.cn/img_convert/b7f40a8e0939a366f3b54583ba180f3f.png)
子组件Child.js
![5023f2d1ceb000ed2dccc15515faf436.png](https://img-blog.csdnimg.cn/img_convert/5023f2d1ceb000ed2dccc15515faf436.png)
在上面的例子中,父组件Parent通过title属性向子组件Child传递值,子组件Child通过this.prop.title就可以获取到父组件Parent的传递的值 2)子组件到父组件:利用回调函数
父组件Parent.js
![d19f7a8deac236291d133288e3982898.png](https://img-blog.csdnimg.cn/img_convert/d19f7a8deac236291d133288e3982898.png)
子组件Child.js
![bf73d2ececc6c97656f5db3bcc7e2fb7.png](https://img-blog.csdnimg.cn/img_convert/bf73d2ececc6c97656f5db3bcc7e2fb7.png)
上面例子中,在子组件Child中绑定了onClick事件。调用成本cb()方法。在cb()方法中,通过props发送出去一个方法,父组件中去接收这个方法,callback={this.callback},然后在自身的callback函数中进行一些列操作。
3)跨级组件:即父组件向子组件的子组件通信,向更深层子组件通信①中间组件层层传递props②使用context对象
对于第一种方式,如果父组件结构较深,那么中间每一层组件都要去传递props,增加了复杂度,并且这些props并不是中间组件自己需要的。
使用context方式中context相当于一个全局变量,是一个大容器,我们可以把要通信的内容放在这个容器中,这样不管嵌套多深。都可以随意取用。使用context要满足两个条件:上级组件要声明自己支持context,并提供一个函数来返回相应的context对象、子组件要声明自己需要使用context
父组件Parent.js
![a67c4f58e3a4d7d8d7cebc19f85f201e.png](https://img-blog.csdnimg.cn/img_convert/a67c4f58e3a4d7d8d7cebc19f85f201e.png)
子组件Child.js
![86ff47f06c88268a150365c2cea36f93.png](https://img-blog.csdnimg.cn/img_convert/86ff47f06c88268a150365c2cea36f93.png)
子组件的子组件GrandChild.js
![84c249b7bf0bb2ed9e68346881f3f2b6.png](https://img-blog.csdnimg.cn/img_convert/84c249b7bf0bb2ed9e68346881f3f2b6.png)
4)非嵌套组件:即没有任何包含关系的组件,包括兄弟组件以及不在同一个父级中的非兄弟组件。①利用二者共同父组件的context对象通信②使用自定义事件
使用二者共同父级进行中转会增加子组件和父组件间的耦合度,如果组件层次比较深,找到二者共同父组件会相对麻烦。
使用自定义事件方式需要使用events包:npm install -S events创建event.js文件,向外提供一个事件
![628eeddb3c8f4d20b2cbc8fdce57ee98.png](https://img-blog.csdnimg.cn/img_convert/628eeddb3c8f4d20b2cbc8fdce57ee98.png)
父组件Parent.js
![3b6eda3ef31b9fe1d4f92da5e804012b.png](https://img-blog.csdnimg.cn/img_convert/3b6eda3ef31b9fe1d4f92da5e804012b.png)
组件Aoo.js
![8cbdccb0666001b9628fa74ed94363e5.png](https://img-blog.csdnimg.cn/img_convert/8cbdccb0666001b9628fa74ed94363e5.png)
组件Boo.js
![9b785b3bd05aaa76bfc7ab4acb6e131d.png](https://img-blog.csdnimg.cn/img_convert/9b785b3bd05aaa76bfc7ab4acb6e131d.png)
实际应用中,在组件间进行通信时,这些通信方式都可以使用,区别只在于使用相应的通信方式的复杂程度和个人喜好,选择最合适的那一个。比如,通过事件订阅模式通信不止可以应用在非嵌套组件间,还可以用于跨级组件间,非嵌套组件间通信也可以使用context。