| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- <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>
|