vue更改element菜单组件el-menu为横向展开状态

vue更改element菜单组件el-menu为横向展开状态

先上效果图
在这里插入图片描述
为了实现类似商品分类的样式,并且触发菜单展开的方式为点击;
el-menu组件collapse参数设置为true后有类似的样式可以使用,但触发方式为鼠标移动到选项上;
在这里插入图片描述

并且使用collapse的mode属性下不能修改触发方式;在这里插入图片描述
如果子菜单触发方式设为点击,mode属性必须设为horizontal
在这里插入图片描述
和需要的样式差别太大(苦涩)

最后的解决方案是把竖向的菜单修改为横向的
重点的代码:


  /deep/.el-submenu {
    position: relative;
  }
  /deep/.el-menu--inline {
    position: absolute;
    z-index: 1;
    top: 0;
    left: 200px;
  }

完整代码

<template>
  <div class="institution-menu">
    <div class="menu-search">
      <el-select v-model="form.department" size="small" placeholder="请选择部门" style="width: 200px">
        <el-option v-for="item of departmentList" :key="item.id" :label="item.title" :value="item.title"></el-option>
      </el-select>
      <el-input v-model="form.content" size="small" placeholder="请输入需搜索的内容" style="width: 200px" suffix-icon="el-icon-search"></el-input>
      <el-button type="primary" size="small">更多搜索</el-button>
    </div>
    <el-menu unique-opened default-active="2-1-1" class="institution-el-menu" @open="handleOpen" @close="handleClose" @select="handleMenuSelect">
      <div v-if="menuList && menuList.length">
        <div v-for="item of menuList" :key="item.id">
          <el-submenu v-if="item.list && item.list.length" :index="item.id">
            <template slot="title">
              <i>{{item.name}}</i>
            </template>
            <div v-for="it of item.list" :key="it.id">
              <el-submenu v-if="it.list && it.list.length" :index="it.id" class="submenu">
                <span slot="title">{{it.name}}</span>
                <div v-for="i of it.list" :key="i.id">
                  <el-submenu v-if="i.list && i.list.length" :index="i.id" class="submenu">
                    <span slot="title">{{i.name}}</span>
                    <div v-for="e of i.list" :key="e.id">
                      <el-submenu v-if="e.list && e.list.length" :index="e.id" class="submenu">
                        <span slot="title">{{e.name}}</span>
                        <div v-for="l of e.list" :key="l.id">
                          <!-- <div v-if="l.list && l.list.length"> -->
                            <el-menu-item :index="l.id">{{l.name}}</el-menu-item>
                          <!-- </div> -->
                        </div>
                      </el-submenu>
                      <div v-else>
                        <el-menu-item :index="e.id">{{e.name}}</el-menu-item>
                      </div>
                    </div>
                  </el-submenu>
                  <div v-else>
                    <el-menu-item :index="i.id">{{i.name}}</el-menu-item>
                  </div>
                </div>
              </el-submenu>
              <div v-else>
                <el-menu-item :index="it.id">{{it.name}}</el-menu-item>
              </div>
            </div>
          </el-submenu>
          <el-menu-item v-else :index="item.id">
            <i>{{item.name}}</i>
          </el-menu-item>
        </div>
      </div>
      <div v-else style="width: calc(100vw - 200px);height: 70px;background: #fff;line-height: 70px;text-align: center;">
        - 暂无数据 -
      </div>
    </el-menu>
  </div>
</template>

<script>
  // import x from ''
  export default {
    props: {
      type: {
        type: String,
        default: 'using'
      }
    },
    components: {

    },
    data() {
      return {
        form: {
          department: '',
          content: ''
        },
        departmentList: [
          {title: '111', id: 111},
          {title: '222', id: 222},
          {title: '333', id: 333}
        ],
        menuLi3st: [],
        menuList: [
          {
            name: 'first', id: '1', list: [
              {
                name: 'first-1', id: '1-1', list: [
                  {
                    name: 'first-1-1', id: '1-1-1',
                    list: [
                      {
                        name: 'first-1-1-1', id: '1-1-1-1', list: [
                          {
                            name: 'first-1-1-1-1', id: '1-1-1-1-1'
                          },
                          {
                            name: 'first-1-1-1-2', id: '1-1-1-1-2'
                          }
                        ]
                      },
                      {
                        name: 'first-1-1-2', id: '1-1-1-2'
                      }
                    ]
                  },
                  {
                    name: 'first-1-2', id: '1-1-2'
                  }
                ]
              },
              {
                name: 'first-2', id: '2-1'
              }
            ]
          },
          {
            name: 'second', id: '2', list: [
              {
                name: 'second-1', id: '2-1', list: [
                  {
                    name: 'second-1-1', id: '2-1-1'
                  }
                ]
              }
            ]
          },
          {
            name: 'third', id: '3'
          }
        ]

      }
    },
    computed: {

    },
    watch: {
      form: {
        handler: function() {
          this.getData()
        },
        deep: true
      }

    },
    mounted() {
    },
    methods: {
      getData() {
        console.log('getData')
      },
      handleOpen(key, keyPath) {
        console.log(key, keyPath);
      },
      handleClose(key, keyPath) {
        console.log(key, keyPath);
      },
      handleMenuSelect(index, indexPath) {
        console.log(index, indexPath, ' index, indexPath')
      }
    }
  }
  
</script>
<style lang='scss' scoped>
  .institution-menu {
    height: calc(100vh - 160px);
    width: 100%;
    padding: 10px;
  }
  .institution-el-menu {
    margin: 20px 50px;
  }
  .menu-search {
    display: flex;
    justify-content: center;
  }
  .el-menu-item i {
    color: #333;
  }
  i {
    font-style: inherit;
    font-size: 14px;
  }
  .el-menu-item {
    padding: 0;
    min-width: 200px;
    background-color: #eee;
  }
  .el-submenu{
    min-width: 200px;
  }
  .el-submenu__title i {
    color: #fff;
  }
  .el-menu--collapse {
    width: 200px;
  }
  .el-menu {
    width: 200px;
  }
  /deep/.el-submenu {
    position: relative;
  }
  /deep/.el-menu--inline {
    position: absolute;
    z-index: 1;
    top: 0;
    left: 200px;
  }
</style>

甲方万恶啊啊啊啊啊啊[○・`Д´・ ○]

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要按条件展开 Vue3 的 el-menu,可以使用 v-model 绑定 el-menu展开状态,并且在绑定的属性中设置一个变量,来控制 el-menu展开状态。例如: ```html <template> <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" v-model="isCollapsed"> <el-submenu index="1"> <template #title> <i class="el-icon-location"></i> <span>导航一</span> </template> <el-menu-item-group> <template #title>分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template #title>选项4</template> <el-menu-item index="1-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> <el-menu-item index="2"> <i class="el-icon-menu"></i> <span>导航二</span> </el-menu-item> <el-menu-item index="3"> <i class="el-icon-setting"></i> <span>导航三</span> </el-menu-item> </el-menu> </template> <script> import { ref } from 'vue'; export default { name: 'MenuDemo', setup() { const isCollapsed = ref(false); // 控制 el-menu展开状态 const activeIndex = ref('1-1'); // 控制 el-menu 默认选中项 return { isCollapsed, activeIndex, }; }, }; </script> ``` 在这个示例中,我们使用了 ref 创建了一个名为 isCollapsed 的变量,并将其绑定到了 el-menu 的 v-model 属性上,这样就可以通过修改 isCollapsed 的值来控制 el-menu展开状态了。最后,我们将 isCollapsed 变量返回给模板中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值