一、父子组件之间通信
a. 父组件 ==》 子组件
1. 通过props属性进行传递
props: {
info: {
type: String
}
}
< child info= "hello world" > < / child>
2. 通过refs引用
< child refs= "child" > < / child>
this . $refs. child. xxx
b. 子组件 ==》 父组件
this . $emit ( 'test' , 'hello' ) ;
< child @test= "testEvent" < / child>
二、兄弟组件之间通信
通过共同祖辈搭桥实现通信(\$parent / \$root)
this . $parent. $emit ( 'add' , 'hello' ) ;
this . $parent. $on ( 'add' , add) ;
三、祖先与后代之间通信
a. 祖先 ==》 后代
通过provide和inject进行传值
provide ( ) {
return {
foo: 'foo'
} ;
}
inject: [ 'foo' ]
b. 后代 ==》 祖先
通过dispatch方法进行消息派发
< p @click= "dispatch('add', 'hello')" > < / p>
this . $on ( 'add' , this . add) ;
function dispatch ( eventName, data) {
let parent = this . $parent;
while ( parent) {
parent. $emit ( eventName, data) ;
parent = parent. $parent;
}
}
四、任意两个组件之间通信
通过事件总线或者vuex
export defaule new Vue ( ) ;
import Bus from . / main. vue;
Bus. $emit ( 'add' , 'hello' ) ;
import Bus from . / main. vue;
Bus. $on ( 'add' , this . add) ;
class Bus {
constructor ( ) {
this . eventCb = { } ;
}
$emit ( name, arg) {
if ( this . eventCb[ name] ) {
this . eventCb[ name] . forEach ( cb => cb ( arg) )
}
}
$on ( name, cb) {
this . eventCb[ name] = this . eventCb[ name] || [ ] ;
this . eventCb[ name] . push ( cb) ;
}
}