在vue中很多时候我们需要从别的组件中去拿数据,此时就需要用到父子组件之间的通讯方式,或者非父子组件的通讯方式。那接下来简单的介绍一下。
一、父子组件通信之props、$emit
1.父组件的数据传递给子组件传值,子组件通过props接收
2.子组件想要修改父组件传过来的数据,因为是要遵循单向数据流的,所以是不能直接在子组件里修改父组件传过来的数据的,而是通过$emit触发事件,把想要修改的数据发送给父组件。
代码如下:
二、非父子组件通信
1、event bus 事件总线
①创建一个都能访问到的事件总线
import Vue from 'vue'
const Bus = new Vue()
export default Bus
②假设A组件是接收数据的组件,需要监听Bus实例的事件
created() {
Bus.$on("sendMsg", (data) => {
this.msg = data;
});
},
③假设B组件是发送方,需要触发Bus实例的事件
Bus.$emit('sendMsg','需要的消息')
相当于B组件是把需要发送的数据传递到了事件总线中,哪个组件需要这个数据就从时间总线的实例上拿数据
2、provide、inject
父组件通过provide提供数据,子/孙组件通过inject取值来使用
父组件provide提供数据:
provide(){
return {
color:this.color,
userInfo:this.userInfo
}
},
data() {
return {
color: "pink",
userInfo: {
name: "小明",
age: 18,
},
};
},
子/孙组件inject取值代码:
export default {
inject:['color','userInfo']
};
3、vuex数据管理工具
vuex:是状态管理工具,状态就是数据,类似于事件总线一样,是可以把数据存在vuex,哪个组件需要数据就从vuex中拿,而且vuex能更好的管理数据。
像里面的state:类似于data用来存放数据的,mutations是存放操作state里的数据的方法,只有mutations里可以修改state里的数据。actions:存放一些异步操作 (也可以进行一些同步处理),getters: 存放基于state计算出来的一些值 (计算属性)
使用vuex管理数据的好处有很多,例如:
1、能够在vuex中集中管理共享的数据,易于开发和后期维护;
2、能够高效地实现组件之间的数据共享,提高开发效率;
3、而且存储在vuex的数据都是响应式的,能够实时保持数据与页面的同步...