function broadcast(componentName, eventName, params) {
|
this.$children.forEach(child => {
|
const name = child.$options.name
|
|
if (name === componentName) {
|
child.$emit.apply(child, [eventName].concat(params))
|
} else {
|
// todo 如果 params 是空数组,接收到的会是 undefined
|
broadcast.apply(child, [componentName, eventName].concat([params]))
|
}
|
})
|
}
|
|
export default {
|
methods: {
|
dispatch(componentName, eventName, params) {
|
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))
|
}
|
},
|
broadcast(componentName, eventName, params) {
|
broadcast.call(this, componentName, eventName, params)
|
},
|
findComponentHandler(targetComponentName) {
|
let finedComponent = null
|
|
function find(componentSubs) {
|
for (let i = 0, len = componentSubs.length; i < len; i++) {
|
let component = componentSubs[i]
|
let name = component.$options.name
|
if (name === targetComponentName) {
|
finedComponent = component
|
break
|
}
|
if (targetComponentName !== name) {
|
find(component.$children)
|
} else {
|
return true
|
}
|
}
|
}
|
|
find(this.$children)
|
return finedComponent
|
}
|
}
|
}
|