menu-item.vue 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <template>
  2. <a
  3. v-if="to"
  4. :href="linkUrl"
  5. :target="target"
  6. :class="classes"
  7. @click.exact="handleClickItem($event, false)"
  8. @click.ctrl="handleClickItem($event, true)"
  9. @click.meta="handleClickItem($event, true)"
  10. :style="itemStyle"><slot></slot></a>
  11. <li v-else :class="classes" @click.stop="handleClickItem" :style="itemStyle"><slot></slot></li>
  12. </template>
  13. <script>
  14. import Emitter from '../../mixins/emitter';
  15. import { findComponentUpward } from '../../utils/assist';
  16. import mixin from './mixin';
  17. import mixinsLink from '../../mixins/link';
  18. const prefixCls = 'ivu-menu';
  19. export default {
  20. name: 'MenuItem',
  21. mixins: [ Emitter, mixin, mixinsLink ],
  22. props: {
  23. name: {
  24. type: [String, Number],
  25. required: true
  26. },
  27. disabled: {
  28. type: Boolean,
  29. default: false
  30. },
  31. },
  32. data () {
  33. return {
  34. active: false
  35. };
  36. },
  37. computed: {
  38. classes () {
  39. return [
  40. `${prefixCls}-item`,
  41. {
  42. [`${prefixCls}-item-active`]: this.active,
  43. [`${prefixCls}-item-selected`]: this.active,
  44. [`${prefixCls}-item-disabled`]: this.disabled
  45. }
  46. ];
  47. },
  48. itemStyle () {
  49. return this.hasParentSubmenu && this.mode !== 'horizontal' ? {
  50. paddingLeft: 43 + (this.parentSubmenuNum - 1) * 24 + 'px'
  51. } : {};
  52. }
  53. },
  54. methods: {
  55. handleClickItem (event, new_window = false) {
  56. if (this.disabled) return;
  57. if (new_window || this.target === '_blank') {
  58. // 如果是 new_window,直接新开窗口就行,无需发送状态
  59. this.handleCheckClick(event, new_window);
  60. let parentMenu = findComponentUpward(this, 'Menu');
  61. if (parentMenu) parentMenu.handleEmitSelectEvent(this.name);
  62. } else {
  63. let parent = findComponentUpward(this, 'Submenu');
  64. if (parent) {
  65. this.dispatch('Submenu', 'on-menu-item-select', this.name);
  66. } else {
  67. this.dispatch('Menu', 'on-menu-item-select', this.name);
  68. }
  69. this.handleCheckClick(event, new_window);
  70. }
  71. }
  72. },
  73. mounted () {
  74. this.$on('on-update-active-name', (name) => {
  75. if (this.name === name) {
  76. this.active = true;
  77. this.dispatch('Submenu', 'on-update-active-name', name);
  78. } else {
  79. this.active = false;
  80. }
  81. });
  82. }
  83. };
  84. </script>