Blame view

src/components/mew-menu/menu-item.vue 2.95 KB
b9851cf0   chenhaodong   mew-menu
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  <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';
      import { findComponentUpward } from '../../utils/assist';
      import mixin from './mixin';
      import mixinsLink from '../../mixins/link';
  
      const prefixCls = 'ivu-menu';
  
      export default {
          name: 'MenuItem',
          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);
                      let parentMenu = findComponentUpward(this, 'Menu');
                      if (parentMenu) parentMenu.handleEmitSelectEvent(this.name);
                  } else {
                      let parent = findComponentUpward(this, 'Submenu');
  
                      if (parent) {
                          this.dispatch('Submenu', 'on-menu-item-select', this.name);
                      } else {
                          this.dispatch('Menu', 'on-menu-item-select', this.name);
                      }
  
                      this.handleCheckClick(event, new_window);
                  }
              }
          },
          mounted () {
              this.$on('on-update-active-name', (name) => {
                  if (this.name === name) {
                      this.active = true;
                      this.dispatch('Submenu', 'on-update-active-name', name);
                  } else {
                      this.active = false;
                  }
              });
          }
      };
  </script>