衆所周知,
$on
是作事件監聽,$emit
是作事件的派發,但對於$dispatch
和$broadcast
你們可能就比較陌生了,這對api是vue1.x版本的,在vue2.x裏已經被廢棄vue
$on
和$emit
$dispatch
與 $broadcast
$dispatch
:用於向上級派發事件,只要是它的父級(一級或多級以上),均可以在組件內經過$on
監聽到$broadcast
: 用於向下級派發事件,只要是它的子組件,均可以在組件內經過$on
監聽到如何經過
$on
和$emit
來實現$dispatch
和$broadcast
,思路大概是,向上遞歸查找要通訊的組件,或者向下,咱們將該功能代碼提到mixin中,方便各組件複用api
// emitter.js const broadcast = function(comName,event,data) { this.$children.forEach(p =>{ if(p.$options.name === comName) { p.$emit(event, data) } else{ broadcast.apply(p,comName,event,data) } }) } methods: { /** * comName 目標組件 * event 事件名 * data 要傳的數據 */ broadcast(comName,event,data) { broadcast.call(this, arguments) }, dispatch (comName,event,data) { let parent = this.$parent || this.$root; let name = parent.$options.name; // 這裏是找最接近的父組件 while (parent && (!name || name !== componentName)) { parent = parent.$parent; if (parent) { name = parent.$options.name; } } if (parent) { parent.$emit.apply(parent, [eventName].concat(params)); } }, }
使用案例app
// 父組件A,省略部分代碼 <template> <button @click="handleClick">觸發事件</button> </template> <script> import Emitter from '../mixins/emitter.js'; export default { name: 'componentA', mixins: [ Emitter ], methods: { handleClick () { this.broadcast('componentB', 'sendMsg', 'Hello 我是父組件A'); } } } </script> // 子組件B,省略部分代碼 <script> import Emitter from '../mixins/emitter.js'; export default { name: 'componentB', mixins: [ Emitter ], // 在created或者mounted作事件監聽 created () { this.$on('sendMsg', this.showMsg) }, methods: { showMsg (data) { alert(data) } } } </script>