一:组件中通信的概念
组件通信即指组件(.vue)通过某种方式来传递信息已达到某种目的
vue中每一个组件都是一个单独的作用域,组件间的数据是无法共享的,但是实际开发中,是需要组件间的数据是共享的。
二:组件间通信的分类
- 父子组件间的通信
- 兄弟组件间的通信
- 祖孙与后代组件间的通信
- 非关系组件间的通信
三:组件间通信的方案
8个方案:
1,通过props传递
2,通过$emit()触发自定义事件
3,ref
4,EventBus
5,parent和root
6,attrs与listeners
7,Provide与Inject
8,Vuex
props传递数据
适用场景:父组件--》子组件
子组件设置props属性,定义接收父组件传递过来的参数
父组件在使用子组件标签中通过字面量来传递值
$emit触发自定义事件
适用场景: 子组件传递数据给父组件
子组件通过emit第二个参数为传递的数值
父组件绑定监听器获取到子组件传递过来的参数
ref
父组件在使用子组件的时候设置ref
父组件通过设置子组件ref来获取数据
EventBus
使用场景: 兄弟组件传值
创建一个中央时间总线EventBus
兄弟组件通过emit第二个参数为传递的数值
另一个兄弟组件通过$on监听自定义事件
parent或root
通过共同祖辈root搭建通行侨联
attrs与listeners
适用场景:祖先传递数据给子孙
设置批量向下传属性listeners
包含了父级作用域中不作为prop被识别的特性绑定(class和style除外)
可以通过v-bind="$attrs"传入内部组件
provide与inject
在祖先组件定义provide属性,返回传递的值
在后代组件通过inject接收组件传递过来的值
vuex或者pinia
适用场景:复杂关系的组件数据传递
Vuex作用相当于一个用来存储共享变量的容器
state用来存放共享变量的地方
getter,可以增加一个getter派生状态,相当于store中的计算属性,用来获取共享变量的值
mutations用来存放修改state的方法
actions 也是用来存放修改state的方法,不过action是在mutations的基础上进行。常用来做一些异步操作
小结
父子关系的组件数据传递选择props与bus,其次可以选择$parent进行传递
祖先与后代组件数据传递可选择attrs与listeners或者provide与inject
复杂关系的组件数据传递可以通过vuex存放共享的变量