父->子
方式
父组件通过属性的方式给子组件传值,子组件通过props来接受父组件的值。
注意
如果传递的是个对象的话,只改变下面的某个属性子组件中是不会响应式更新的,如果子组件需要在数据变化时响应式更新,可以用watch深拷贝deep:true监听到变化;
如果你传进来的是个对象,同时你又需要在子组件中操作传进来的这个数据,那么在父组件中的这个数据也会改变,因为传递的只是个引用,可通过将对象做深拷贝创建一个副本解决这个问题。
可以但不建议的操作
直接用ref调用子组件函数直接把数据以参数的形式传给子组件;
$children是一个数组,是直接儿子的集合,不保证顺序,也不是响应式。
子->父
方式
子组件通过$emit的操作触发父组件的自定义事件,父组件中监听这个事件并在回调中写相关逻辑。
可以但不建议的操作
可以在子组件中定义一种专供父组件调用的函数,当父组件想要获取子组件数据就直接主动调用ref执行这个函数获取数据;
$parent是当前组件树的根 Vue 实例,如果当前实例没有父实例,此实例将会是其自己。
兄->弟
方式
路由URL参数:把需要跨页面传递的数据放到url后面,跳转到另外页面时获取url字符串获取想要的参数即可。局限性:只适合传递比较小的数据。
EventBus:在组件之外定义一个event-bus.js作为组件间通信的桥梁,也可称之为事件总线。EventBus实现了发布订阅模式,往事件总线里订阅事件用的是on,发布事件用的是emit。
1 | // event-bus.js |
祖先->后代
方式
provide/inject,允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
$attrs:在子组件中添加v-bind=’$attrs’,就把父组件传来的子组件没props接收的数据全部传到孙组件,子组件和孙组件都可以用this.$attrs获取。
注意
provide 和 inject 绑定并不是可响应的。如果数据类型是对象Object,其对象的属性还是可响应的,因为对象格式数据存储的是指针而不是数据,操作的是同一个对象。
通用
方式
1.Vuex集中状态管理:类似与一个共享数据仓库,所有的组件都可以去操作;
2.localStorage,sessionStorage,cooikes之类的存在本地也能做到组件间的通信。