上篇也总结了一下vue组件中的传值方式,父子组件,兄弟组件,隔代组件等,这篇总结了事件总线 Bus,
vuex(简单的了解了一下,具体写法看官网:https://vuex.vuejs.org/),插槽的用法。
任意两个组件之间:事件总线 或 vuex
事件总线: 创建一个Bus负责事件预发,监听和回调管理
//Bus:事件派发,监听和回调管理 class Bus{ constructor(){ this.callbacks={} } $on(name,fn){ this.callbacks[name]=this.callbacks[name]||[] this.callbacks[name].push(fn) } $emit(name,args){ if(this.callbacks[name]){ this.callback[name].forEach(cb=>cb(args)) } } }
//main.js
Vue.prototype.$bus=new Bus()
//child1
this.$bus.$on('foo',handle)
//child2
this.$bus.$emit('foo')
ps:实践中可以用Vue代替Bus。因为它已经实现了相应功能
Vuex:创建唯一的全局数据管理者store,通过它管理数据并通知组件状态变更
插槽
插槽语法是Vue实现的内容分发API,用于复合组件开发,该技术在通用组件库开发中有大量应用
vue2.6.0之后采用全新v-slot语法取代之前的slot,slot-scope
匿名插槽
//child 子组件会将父组件提供的内容分发 <p> <slot></slot> </p>
//parent 父组件提供内容
<child>hello</child>
具名插槽
将内容分发到子组件指定位置
//child <div> <slot></slot> <slot name="centent"></slot> </div> //parent <child> <!--默认插槽用default做参数--> <template v-slot:default>具名插槽</template> <!--具名插槽用插槽名做参数--> <template v-slot:centent>内容……</template> </child>
作用域插槽
分发内容要用到子组件中的数据(数据来自子组件,需要在父组件中进行加工)
//child <div> <slot :foo="foo"></slot> </div> //parent <child> <template v-slot:default="slotProps"> 来自子组件数据:{{slotProps.foo}} </template>
<!--可以直接解构-->
<template v-slot:default="{foo}"> 来自子组件数据:{{foo}} </template>
</child>