用过NavMenu组件的同学应该很熟悉,组件在horizontal模式下提供了两种触发方式:hover和click。然而在click模式下,有个弊端:如果页面中引入多个el-menu组件,由于每个el-menu相互独立,展开一个菜单后,再展开其他菜单时,前面展开的菜单并不会自动收起,这在使用时很不方便。那么,怎么来解决click模式下两个el-menu同时展开的问题呢?(注意:这里说的同时展开不是由unique-opened控制的保持一个子菜单展开)

为了方便说明,我们将接受鼠标点击的导航称为menu,点击menu后展开的菜单称为popper。我想到的方案是,通过click展开popper后,在鼠标离开popper时,主动触发el-menu的close方法,使popper收起。但若展开popper后,鼠标未进入popper,而直接再次点击另一个menu,两个组件还是会同时展开。所以要增加第二个触发条件,在鼠标进入menu时,主动触发el-menu的close方法。

为什么是鼠标进入menu,而不是鼠标离开时触发呢?因为popper展开后,鼠标从menu进入popper的过程中,会触发鼠标离开menu的事件,这时如果触发了close方法,鼠标就永远无法进入popper了。

有了这两个主动触发popper收起的条件,就再也不会出现两个el-menu同时展开了。代码如下:

<div>
    <el-menu v-for="(item,index) in menuArr" mode="horizontal" menu-trigger="click" @open="handleOpen" ref="elMenu">
        <el-submenu popper-class="submenu-popper" :index="index">
        ...
        </el-submenu>
    </el-menu>
</div>
export default {
    data(){
        return{
            menuArr:[...],
            indexArr:[]    //记录展开菜单的index,作为close方法的参数
        }
    },
    methods:{
        hadnleOpen(index){
            const _this = this;
            const elMenu = _this.$refs['elMenu'];
            const popper = document.getElementByClassName('submenu-popper');
            _this.indexArr.push(index);
            for(let i=0;i<popper.length;i++){
                //鼠标离开popper时,关闭popper
                popper[i].onmouseleave = function(){
                    _this.closePopper();
                }
            }
            for(let i=0;i<elMenu.length;i++){
                //鼠标进入menu时,关闭popper
                elMenu[i].$el.onmouseenter = function(){
                    _this.closePopper();
                }
            }
        },
        closePopper(){
            const elMenu = this.$refs['elMenu'];
            for(let i=0;i<elMenu.length;i++){
                this.indexArr.forEach(item=>{
                    elMenu[i].close(item)
                })
            }   
        }
    }
}

 

GitHub 加速计划 / eleme / element
15
3
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 1 年前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐