08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / views / layout / components / menus / subMenu.jsx

import Trigger from './trigger'
import {getOffset,getDefaultTarget} from '@main/utils'
import {filterEmpty} from '@main/utils/props'
import PopMenu from './popMenu'
const SubMenu = {
    inject:["showAllFuncBox","hideAllFuncBox"],
    props:{
        eventKey:{
            type:String
        },
        mode:{
            type:String
        },
        level:{
            type:Number
        },
        parent: {
            type: Object,
            default: null
        },
        isAllFunc:{
            type:Boolean,
        }
    },
    data(){
        return{
            subStyle:{
                left:0,
                top:0,
                display:'none'
            },
            isActive:false,
        }        
    },
    mounted(){ 
        let me=this; 
        let subMenuDom = me.$refs['subMenus'].$el.firstElementChild;
        let h = document.documentElement.offsetHeight;
        let headH=document.querySelector(".pl-header").offsetHeight+(document.querySelector(".pl-navbar")?document.querySelector(".pl-navbar").offsetHeight:0);
        if(!subMenuDom.dataWidth){
            subMenuDom.dataWidth=subMenuDom.offsetWidth;
            me.level!=0&&(subMenuDom.style.width = '0');
        }
        if(!subMenuDom.dataHeight){
            subMenuDom.dataHeight=(subMenuDom.offsetHeight>h-headH?h-headH:subMenuDom.offsetHeight)+1;
            me.level==0&&(subMenuDom.style.height = '0');
        }
    },
    methods:{
        setPotion(){
            let me=this;
            let rect = getOffset(me.$refs['domMenuTitle'],getDefaultTarget()); 
            let subStyle = {
                left: (me.level==0&&!me.isAllFunc)?rect.left:rect.left+rect.width,
                top: (me.level==0&&!me.isAllFunc)?rect.top+rect.height-1:rect.top,
                width:rect.width,
                height:rect.height,
            }
            if(me.level==0&&me.isAllFunc){
                subStyle.left+=10;
            }
            return subStyle;
        },
        show(){
            let me=this; 
            if(me.level!=0){
                me.parent.show&&me.parent.show();
            }
            if(me.isAllFunc){
                me.showAllFuncBox();//当在全部功能中展现菜单,不收起全部功能下拉框
            }
            let p = me.setPotion(),     
                h = document.documentElement.offsetHeight,
                w = document.documentElement.offsetWidth,            
                subMenuDom = me.$refs['subMenus'].$el.firstElementChild,
                headH=document.querySelector(".pl-header").offsetHeight+(document.querySelector(".pl-navbar")?document.querySelector(".pl-navbar").offsetHeight:0);
            //subMenuDom.style.display = 'block'; 
            let sh = subMenuDom.offsetHeight,
                sw = subMenuDom.offsetWidth;
            sh = sh>(h-headH) ? (h-headH) : sh;
            if(subMenuDom.dataWidth){
                sw=subMenuDom.dataWidth;
            }
            if(subMenuDom.dataHeight){
                sh=subMenuDom.dataHeight;
            }
            if(p.left+sw>w){
                subMenuDom.style.left="auto";
                subMenuDom.style.right=-(me.level>0?p.left-p.width:w)+'px';
            }else{
                subMenuDom.style.right="auto";
                subMenuDom.style.left=(me.level>0?p.left-10:p.left)+'px';
            }
            subMenuDom.style.top = ((sh+p.top)>h?(h-sh):p.top)+'px';
            subMenuDom.style.opacity = '1'; 
            subMenuDom.style.height = sh+'px'; 
            subMenuDom.style.width = sw+'px'; 
            let zIndex = window.getComputedStyle(this.$el.parentNode,null)['z-index']*1;
            subMenuDom.style.zIndex=zIndex+1;

            // me.$set(me,'subStyle',{display:'block',...p}); 
            // me.subStyle.display = 'block'; 
            me.isActive =true;
        },
        hide(){
            let me=this;   
            let subMenuDom = me.$refs['subMenus'].$el.firstElementChild;
            if(me.level==0){
                subMenuDom.style.height = '0';
            }else{
                subMenuDom.style.width = '0';
            }
            // me.subStyle.display = 'none';
            me.isActive = false;
        },
        hideParent(){ 
            let me=this;     
            if(me.level!=0){
                me.parent.hide&&me.parent.hideParent();
            }
            this.hide();
        },
        handleTitleMouseEnter(evt){ 
            this.show();
        },
        handleTitleMouseLeave(evt){
            this.hide();
        },
        handleSubMouseEnter(){
            this.show();
            this.$emit('mouseenter');
        },
        handleSubMouseLeave(){      
            this.hideParent();
            this.$emit('mouseleave');
        },
        renderChildren(children){
            let me=this;
            let {...props} = me.$props;
            const {subStyle,isActive} = me;
            let popMenuProps={
                props:{
                    ...props,
                    level:props.level+1,
                    children:children,
                    parent:me
                },
                style:{
                    // ...subStyle,                
                },
                class:{
                    ['pl-menus-sub']:1,
                    ['pl-menus-pop']:1,
                },
                on:{
                    mouseenter:me.handleSubMouseEnter,
                    mouseleave:me.handleSubMouseLeave
                }
            }
            if(me.isAllFunc){
                popMenuProps.class['allFuncSubMenu']=1;
            }
            return (
                <PopMenu ref="domMenuSub" {...popMenuProps}></PopMenu>
            )
        }
    },
    render(h) {
        const props = this.$props;
        const {subStyle,isActive} = this;
        const isInlineMode = props.mode === 'inline';        
        const children = this.renderChildren(filterEmpty(this.$slots.default));
        const nodeProps ={
            class:{
                ['pl-menus-item']:1,
                ['pl-menus-itemSeld']:isActive
            }
        }
        const titleProps={
            attrs:{
                title:this.$slots.title[0].text
            },
            on:{
                mouseenter:this.handleTitleMouseEnter,
                mouseleave:this.handleTitleMouseLeave
            }
        }
        /*                     
            {isInlineMode && children}
            {!isInlineMode && (
            <Trigger>
                {children}
            </Trigger>)}
        */
       /**
        * 菜单太多的问题
        * 子菜单独立渲染 添加滚动条
        */

        return (
            <li {...nodeProps} >
                <div ref="domMenuTitle" class="title" {...titleProps}>
                    {props.level>0&&(<i class="iconfont icon-arrow-right trigger"></i>)}
                    <span class='txt'>{this.$slots.title}</span>
                </div>
                <Trigger ref="subMenus">{children}</Trigger>
                {/* {props.level==0&&(
                    <Trigger>
                        {children}
                    </Trigger>)}
                {
                    props.level>0&&children
                } */}
            </li>
        );
    }
}
export default SubMenu;