08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / views / layout / components / Smenus / subMenu.jsx
caibinghong on 4 Jun 2021 add

import Trigger from './trigger'
import {getOffset,getDefaultTarget} from '@main/utils'
import {filterEmpty} from '@main/utils/props'
import PopMenu from './popMenu'
const SubMenu = {
    props:{
        eventKey:{
            type:String
        },
        mode:{
            type:String
        },
        level:{
            type:Number
        },
        hasTitle:{
            type:Boolean
        },
        parent: {
            type: Object,
            default: null
        }
    },
    data(){
        return{
            subStyle:{
                left:0,
                top:0,
                display:'none'
            },
            isActive:false,
        }        
    },
    methods:{
        setPotion(){
            let me=this;
            let rect = getOffset(me.$refs['domMenuTitle'],getDefaultTarget()); 
            let subStyle = {
                left: me.level==0?rect.left:rect.left+rect.width,
                top: me.level==0?rect.top+rect.height-1:rect.top,
                width: rect.width,
                height: rect.height
            }
            return subStyle;
        },
        show(){
            let me=this; 
            if(me.level!=0){
                me.parent.show&&me.parent.show();
            }
            let p = me.setPotion(),     
                h = document.documentElement.offsetHeight,
                w = document.documentElement.offsetWidth,    
                subMenuDom = me.$refs['subMenus'].$el.firstElementChild;
            subMenuDom.style.display = 'block'; 
            let sh = subMenuDom.offsetHeight,
                sw = subMenuDom.offsetWidth;
            sh = sh>h?h:sh;
            if(me.level>0){
                subMenuDom.style.left = (p.left+sw>w?w-sw:p.left)+'px';
                // subMenuDom.style.left = p.width + sw + 'px';
                subMenuDom.style.top = (p.top+sh>h?h-sh:p.top)+'px';
            }else{
                // subMenuDom.style.left = (p.left+sw>w?w-sw:p.left)+'px';
                subMenuDom.style.left = p.width + 'px';
                subMenuDom.style.top = (p.top+sh>h?h-sh:p.top-p.height)+'px';
            }
            // subMenuDom.style.left = 171 + 'px';
            // subMenuDom.style.top = (p.top+sh>h?h-sh:p.top-36)+'px';
            // subMenuDom.style.top = (p.top-36) + 'px';
            subMenuDom.style.height = sh+'px'; 
            subMenuDom.style.display = 'block'; 
            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;
            subMenuDom.style.display = 'none'; 
            // 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();
        },
        handleSubMouseLeave(){           
            this.hideParent();
        },
        renderChildren(children){
            let {...props} = this.$props;
            const {subStyle,isActive} = this;
            let popMenuProps={
                props:{
                    ...props,
                    level:props.level+1,
                    hasTitle:props.hasTitle,
                    children:children,
                    parent:this
                },
                style:{
                    // ...subStyle,                
                },
                class:{
                    ['pl-Smenus-sub']:1,
                    ['pl-Smenus-pop']:1,
                },
                on:{
                    mouseenter:this.handleSubMouseEnter,
                    mouseleave:this.handleSubMouseLeave
                }
            }
            return (
                <PopMenu ref="domMenuSub" {...popMenuProps}></PopMenu>
            )
        }
    },
    render(h) {
        const props = this.$props;
        const hasTitle = props.hasTitle;
        const {subStyle,isActive} = this;
        const isInlineMode = props.mode === 'inline';        
        const children = this.renderChildren(filterEmpty(this.$slots.default));
        const nodeProps ={
            class:{
                ['pl-Smenus-item']:1,
                ['pl-Smenus-itemSeld']:isActive
            },
            style:{
                ['wdith']: hasTitle?'140px':'48px'
            }
        }
        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="icon iconfont icon-bell"></i>)}
                    {hasTitle &&(props.level>=0&&(<i class="iconfont icon-arrow-right trigger"></i>))
                    || !hasTitle &&(props.level>0&&(<i class="iconfont icon-arrow-right trigger"></i>))}
                    <span v-show={hasTitle || (!hasTitle && props.level > 0)} 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;