Element - mixin - emitter Posted on 2018-05-10 | In vue 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