08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / components / contextMenu / ContextMenuItem.vue
<template>
    <li ref="contextMenu" @click="handleClick(item, $event)" :class="itemClass" :title="item[field]">
        <div class="label" :class="(item.hoverBtn||item.chooseIcon)?'withHoverBtn':''">
            <i class="iconfont" :class="item.iconClass" v-if="item.iconClass"></i>
            <span class="item-label" v-html="item.html||item[field]"></span>
            <span class="children-indicator iconfont icon-arrow-right trigger" v-if="item.children"></span>
            <div class="chooseIcon" v-if="item.chooseIcon" :title="item.chooseIcon.title">
              <i :class="item.chooseIcon.iconClass"></i>
            </div>
            <div class="hoverBtn" v-if="item.hoverBtn" :title="item.hoverBtn.title" @click="hoverBtnHandleClick(item.hoverBtn,$event)">
              <i :class="item.hoverBtn.iconClass"></i>
            </div>
        </div>
        <ul class="context-menu" v-if="item.children" :style="contextMenuStyle">
            <context-menu-item
                    v-for="(childItem, index) in item.children"
                    :item="childItem"
                    :field="field"
                    :key="index">
            </context-menu-item>
        </ul>
    </li>
</template>

<script>
export default {
  name: 'context-menu-item',
  props: {
    item: {
      type: Object,
    },
    field:{
      type:String,
      default:'title'
    }
  },
  inject:['getActiveKey','setActiveKey'],
  data(){
    return {
      contextMenuStyle:"",
    }
  },
  computed:{
    itemClass() {
      let item =this.item;
      return {
        // 'item-active':(item.id!=null)&&this.activeKey==item.id,
        'item-active':item.actived,
        'item-disabled': this.isItemDisabled(item)
      };
    },
    activeKey(){
      return this.getActiveKey();
    },
  },
  watch:{
    "item.children":{
      handler:function(val,old){
        setTimeout(()=>{
          if(!this.$refs.contextMenu){
            this.contextMenuStyle= "";
          }else{
            let _domRect=this.$refs.contextMenu.getBoundingClientRect();
            this.contextMenuStyle= "max-height:calc(100vh - "+(_domRect.top+30)+"px)";
          }
        },100);
      },
      immediate: true,
      deep: true
    }
  },
  methods: {
    handleClick(item, event) {

      // !item.children&&this.setActiveKey(item.id);
      if (typeof item.handler !== 'undefined') {
      
        if (!this.isItemDisabled(item)) {
          item.handler(event);
        } else {
          
          event.stopPropagation();
        }

      }else{

      }

    },
    hoverBtnHandleClick(item,event){
      event.stopPropagation();
      if (typeof item.handler !== 'undefined') {
        item.handler(event);
      }
    },
    

    isItemDisabled(item) {
      if (typeof item.disabled !== 'undefined') {
        return item.disabled;
      }

      return false;
    },
  },
};
</script>