派生自 wuyushui/SewerAndRainNetwork

wangrui
2020-12-14 0d7669f8bf28300362fc0dacd5c794ff823d0297
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
    }
  }
}