常见使用场景可以分为三类:
- 父子通信:
父向子传递数据是通过 props,子向父是通过 events($emit
);
通过父链 / 子链也可以通信($parent
/$children
);
ref 也可以访问组件实例;
provide / inject API;$attrs/$listeners
- 兄弟通信: Bus;Vuex
- 跨级通信: Bus;Vuex;provide / inject API、
$attrs/$listeners
父子爷孙组件通信
多级组件嵌套需要传递数据时,通常使用的方法是通过 vuex。但如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,未免有点大材小用。为此 Vue2.4 版本提供了另一种方法—-$attrs/$listeners
$attrs
$attrs 里存放的是父作用域中不作为 prop 的特性绑定 (class 和 style 除外) 而且在子组件中也没有props注册的属性
**
父组件要传的值(age,name),在子组件中, 没用props注册. 在子组件中包含在
$attrs
中, 以object
的形式访问到.
$listeners
子组件可以触发父组件的事件(不需要用什么那些麻烦的vuex或者一个空的 Vue 实例作为事件总线,或者又是什么vm.$on )
provide inject 通信
使用Vue.observable实现数据响应式
// provide() {
// this.theme = Vue.observable({
// color: "blue"
// });
// return {
// theme: this.theme
// };
// },
// methods: {
// changeColor(color) {
// if (color) {
// this.theme.color = color;
// } else {
// this.theme.color = this.theme.color === "blue" ? "red" : "blue";
// }
// }
// }
最小化的跨组件状态存储器
Vue.observable( object ) 2.6.0 新增
返回的对象可以直接用于渲染函数和计算属性内,并且会在发生改变时触发相应的更新。也可以作为最小化的跨组件状态存储器,用于简单的场景: