# 组件通信
组件通信常用方式
- props
- eventBus
- vuex
- 自定义事件(接收props)
边界情况
- $parent
- $children
- $root
- $refs
- provide/inject
- attrs
- listeners
# props父组件给子组件传值
//parent
<Hello :msg="hello"></Hello>
//child
props:{
msg:string
}
# 父子组件通信
子组件emit,在父组件中通过自定义事件接收子组件的emit触发,
注意:父子组件通信 是在子组件中触发,在子组件中监听。
# eventBus事件总线实现
事件总线实现思路,发布订阅模式 $on $emit $off
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.callbacks[name].forEach(cb => cb(args))
}
}
}
//使用
// main.js
Vue.prototype.$bus = new Bus()
// child1
this.$bus.$on('foo', handle)
// child2
this.$bus.$emit('foo')
# $parent/$root
兄弟组件之间通信可通过共同父辈搭桥和evenBus事件总线类似,事件的派发者和监听者必须是同一个。
this.$parent.$on('test',fn)
this.$parent.$emit('test')
# $children
父组件可以通过$children访问子组件实例实现父子组件通信
$children不能保证子元素顺序,(如果某一个组件是异步组件,那么$children子元素的顺序是不确定的)
this.$children[0].xx == 'xxx'
# $attrs的使用
//父组件中
<Children :msg="111"/>
//子组件
如果子组件不同props接收,父组件传过来的msg,那么msg就会把收纳到$attrs中 $attrs中数据内容 {"msg": 111 }
# refs
获取子节点的引用。还可以获取DOM元素
# provide/inject
祖辈组件之间传值
//祖辈组件
provide(){
return {hello :"111"}
}
//子组件
inject:['hello']
# .sync修饰符
父子组件在传递值类型时,子组件修改值想要父组件同步更新。可以通过.sync方法简写 @update:msg = "msg = $event"作用和 .sync作用一致。
//父组件
<template>
<div>{{msg}}</div>
<children
:msg.sync="msg"
@update:msg = "msg = $event"//vue2写法
:msg.sync = "msg"//vue2语法糖
v-modal:msg="msg"//vu3去掉sync写法,使用v-modal语法糖
/>
</template>
//子组件
export default {
props:{
msg:[String,Number]
},
methods: {
changeInfo(){
this.$emit('update:msg','111')
console.log( this.msg)
}
}
}
# 插槽
- 匿名插槽
//父组件
<Hello>123</Hello>
//子组件
<template>
<solt></solt> //展示123
</temaplate>
- 具名插槽,即指定名字的插槽
//父组件
<Hello>
<solt name="header">111</solt>
</Hello>
//子组件
<template v-slot:header></template>
- 作用域插槽 分发内容用到子组件的数据