Blame view

src/components/mew-menu/menu-item.vue 3.33 KB
b9851cf0   chenhaodong   mew-menu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  <template>
      <a
          v-if="to"
          :href="linkUrl"
          :target="target"
          :class="classes"
          @click.exact="handleClickItem($event, false)"
          @click.ctrl="handleClickItem($event, true)"
          @click.meta="handleClickItem($event, true)"
          :style="itemStyle"><slot></slot></a>
      <li v-else :class="classes" @click.stop="handleClickItem" :style="itemStyle"><slot></slot></li>
  </template>
  <script>
      import Emitter from '../../mixins/emitter';
7b487076   chenhaodong   fix
15
      import { findComponentUpward, findBrothersComponents, findComponentsDownward } from '../../utils/assist';
b9851cf0   chenhaodong   mew-menu
16
17
18
19
20
21
      import mixin from './mixin';
      import mixinsLink from '../../mixins/link';
  
      const prefixCls = 'ivu-menu';
  
      export default {
7b487076   chenhaodong   fix
22
          name: 'MewMenuItem',
b9851cf0   chenhaodong   mew-menu
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
58
59
60
61
62
          mixins: [ Emitter, mixin, mixinsLink ],
          props: {
              name: {
                  type: [String, Number],
                  required: true
              },
              disabled: {
                  type: Boolean,
                  default: false
              },
          },
          data () {
              return {
                  active: false
              };
          },
          computed: {
              classes () {
                  return [
                      `${prefixCls}-item`,
                      {
                          [`${prefixCls}-item-active`]: this.active,
                          [`${prefixCls}-item-selected`]: this.active,
                          [`${prefixCls}-item-disabled`]: this.disabled
                      }
                  ];
              },
              itemStyle () {
                  return this.hasParentSubmenu && this.mode !== 'horizontal' ? {
                      paddingLeft: 43 + (this.parentSubmenuNum - 1) * 24 + 'px'
                  } : {};
              }
          },
          methods: {
              handleClickItem (event, new_window = false) {
                  if (this.disabled) return;
  
                  if (new_window || this.target === '_blank') {
                      // 如果是 new_window,直接新开窗口就行,无需发送状态
                      this.handleCheckClick(event, new_window);
7b487076   chenhaodong   fix
63
                      let parentMenu = findComponentUpward(this, 'MewMenu');
b9851cf0   chenhaodong   mew-menu
64
65
                      if (parentMenu) parentMenu.handleEmitSelectEvent(this.name);
                  } else {
7b487076   chenhaodong   fix
66
                      let parent = findComponentUpward(this, 'MewSubmenu');
b9851cf0   chenhaodong   mew-menu
67
68
  
                      if (parent) {
7b487076   chenhaodong   fix
69
                          this.dispatch('MewSubmenu', 'on-menu-item-select', this.name);
b9851cf0   chenhaodong   mew-menu
70
                      } else {
7b487076   chenhaodong   fix
71
                          this.dispatch('MewMenu', 'on-menu-item-select', this.name);
b9851cf0   chenhaodong   mew-menu
72
                      }
7b487076   chenhaodong   fix
73
74
75
76
77
78
                      findBrothersComponents(this, 'SideMenuItem',false).forEach(item => {
                          findComponentsDownward(item, 'MewSubmenu').forEach(item => {
                              item.active = false;
                              item.opened = false
                          });
                      });
b9851cf0   chenhaodong   mew-menu
79
80
81
82
83
84
85
86
87
  
                      this.handleCheckClick(event, new_window);
                  }
              }
          },
          mounted () {
              this.$on('on-update-active-name', (name) => {
                  if (this.name === name) {
                      this.active = true;
7b487076   chenhaodong   fix
88
                      this.dispatch('MewSubmenu', 'on-update-active-name', name);
b9851cf0   chenhaodong   mew-menu
89
90
91
92
93
94
95
                  } else {
                      this.active = false;
                  }
              });
          }
      };
  </script>