Element - mixin - emitter

function broadcast(componentName, eventName, params) {
// 所有子组件遍历
this.$children.forEach(child => {
var name = child.$options.componentName

// 找到匹配的组件,并派发事件和参数
if (name === componentName) {
child.$emit.apply(child, [eventName].concat(params))
} else {
// 否则继续递归向下
broadcast.apply(child, [componentName, eventName].concat([params]))
}
})
}

export default {
// mixin注入这2个methods

methods: {
// 派发事件
dispatch(componentName, eventName, params) {
// 拿到父组件,默认根组件
var parent = this.$parent || this.$root

// componentName 是他们自定义的属性.很多组件间用于判断组件类型
var name = parent.$options.componentName

// 一直递归向上找父组件

while (parent && (!name || name !== componentName)) {
parent = parent.$parent

if (parent) {
name = parent.$options.componentName
}
}
// 如果找到了就派发事件和相应的参数
if (parent) {
parent.$emit.apply(parent, [eventName].concat(params))
}
},

// 这个方法类似dispatch,不过是向下广播具体看上面注释
broadcast(componentName, eventName, params) {
broadcast.call(this, componentName, eventName, params)
}
}
}

知识点:

  • mixin
  • apply
  • call
  • \$option
  • \$parent
  • \$emit
  • \$root
  • \$children