动态监听菜单长度,多余的菜单项自动添加到更多选项,用于下拉选择

项目需求:

横向菜单栏,菜单过多时自动折叠到下拉框,可伸缩。
参考:
文章


解决方案:

使用了element-plus组件

<template>
  <div class="box">
    <el-menu :default-active="activeIndex" class="el-menu-demo menuList" mode="horizontal" @select="handleSelect">
      <el-menu-item v-for="item in data" :key="item.id" class="menuItem" :index="item.id">{{ item.text }}</el-menu-item>
      <el-sub-menu v-if="moreArr.length > 0" class="menuItem">
        
        <el-menu-item v-for="i in moreArr" :key="i.id" :index="i.id">{{
          i.text
        }}</el-menu-item>
      </el-sub-menu>
    </el-menu>
  </div>
</template>

<script setup>
import { reactive, ref, computed, onMounted, watch } from "vue";


let activeIndex = ref('1')
let data = reactive([
  {
    id: "1",
    text: "处理中心",
  },
  {
    id: "2",
    text: "处理中心2ssewfergreg",
  },
  {
    id: "3",
    text: "处理中心3",
  },
  {
    id: "4",
    text: "处理中心4",
  },
  {
    id: "5",
    text: "处理中心5",
  },
  {
    id: "6",
    text: "处理中心6",
  },
  {
    id: "7",
    text: "处理中心7",
  },
  {
    id: "8",
    text: "处理中心8",
  },
  {
    id: "9",
    text: "处理中心9",
  },
  {
    id: "10",
    text: "处理中心10",
  },
  {
    id: "11",
    text: "处理中心11",
  },
  {
    id: "12",
    text: "处理中心12",
  },
  {
    id: "13",
    text: "处理中心13",
  },
  {
    id: "14",
    text: "处理中心14",
  },
  {
    id: "15",
    text: "处理中心15",
  },
  {
    id: "16",
    text: "处理中心16",
  },
  {
    id: "17",
    text: "处理中心17",
  },
  {
    id: "18",
    text: "处理中心18",
  },
])
let newArr = reactive([])
let existing = ref(0)
let moreArr = reactive([])
let isb = ref(false)
let isr = ref(false)
let resData = reactive([])
let allItemWidth = reactive([])
let isExpanding = ref(false)
let curWindow = ref(0)

onMounted(() => {
  resData = JSON.parse(JSON.stringify(data))
  const widthList = document.getElementsByClassName("menuItem")
  for (let i = 0; i < widthList.length; i++) {
    if (widthList[i].clientWidth) {
      allItemWidth.push(widthList[i].clientWidth);
    }
  }
  initMenu()
})


function initMenu() {
  data = resData
  let newArr = JSON.parse(JSON.stringify(data));
  let menuitem = []
  if (isExpanding.value) {
    menuitem = allItemWidth.slice(0, data.length - 1)
  } else {
    menuitem = document.getElementsByClassName("menuItem");
  }
  let widthArr = [];
  for (let i = 0; i < menuitem.length; i++) {
    if (menuitem[i]) {
      widthArr.push(menuitem[i]);
    }
  }
  if (isExpanding.value) {
    isReduce(widthArr);
  } else {
    isbeyond(widthArr)
  }
  let arr = [];
  if (existing.value != 0) {
    arr = newArr.splice(existing.value, newArr.length - 1);
  }
  moreArr = arr;
}
function handleSelect(key, keyPath) {
  console.log(key, keyPath);
}
function sum(arr) {
  return arr.reduce(function (prev, curr, idx, arr) {
    return prev + curr;
  });
}
function isbeyond(widthArr) {
  let menu = document.getElementsByClassName("menuList");
  if (sum(widthArr) >= menu[0].clientWidth && !isExpanding.value) {
    isb.value = true;
    let newArr = data.slice(0, data.length - 1);
    let newWidthArr = widthArr.slice(0, data.length - 1);
    data = newArr;
    isbeyond(newWidthArr);
  } else {
    if (isb.value) {
      data = data.slice(0, widthArr.length - 1)
      existing.value = data.length;
    }
  }
}

function isReduce(widthArr) {
  let menu = document.getElementsByClassName("menuList");
  let addWidthArr = allItemWidth.slice(0, widthArr.length)
  if (sum(addWidthArr) <= menu[0].clientWidth && isExpanding.value) {
    isr.value = true;
    let newArr = resData.slice(0, addWidthArr.length + 1);
    let newWidthArr = allItemWidth.slice(0, addWidthArr.length + 1);
    data = newArr;
    isReduce(newWidthArr);
  } else {
    if (isr.value) {
      data = data.slice(0, widthArr.length - 1)
      existing.value = data.length;
    }
  }
}
window.onresize = () => {
  isExpanding.value = document.documentElement.clientWidth > curWindow.value ? true : false
  curWindow.value = document.documentElement.clientWidth
  if (data.length > 1 && data.length < resData.length) {
    initMenu()
  }
}
</script>


<style  scoped>
.box {
  background: #fff;
  width: 80%;
  height: 100px;
  margin: 0 auto;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用layui的table模块的on()方法来监听表格行的添加,然后在回调函数中动态添加菜单。 以下是一个示例代码: HTML: ```html <table class="layui-table" id="demo"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td>10001</td> <td>小明</td> <td><a href="javascript:;" class="add-dropdown">添加菜单</a></td> </tr> <tr> <td>10002</td> <td>小红</td> <td><a href="javascript:;" class="add-dropdown">添加菜单</a></td> </tr> </tbody> </table> ``` JavaScript: ```javascript layui.use(['table', 'layer'], function(){ var table = layui.table; var layer = layui.layer; // 监听表格行的添加 table.on('tool(demo)', function(obj){ if(obj.event === 'add'){ var trElem = obj.tr; // 获取当前行的DOM对象 var dropdownElem = $('<div class="layui-table-cell"></div>'); // 创建下菜单的DOM对象 var selectElem = $('<select><option value="">请选择</option><option value="1">选项1</option><option value="2">选项2</option><option value="3">选项3</option></select>'); // 创建下菜单中的选项 dropdownElem.append(selectElem); // 将选项添加到下菜单中 $(trElem).find('.add-dropdown').parent().after(dropdownElem); // 将下菜单添加到当前行中 } }); }); ``` 在上面的示例代码中,我们使用了jQuery来创建和操作DOM对象。首先,我们在每个操作列中添加了一个class为`add-dropdown`的超链接,当用户点击这个超链接时,会触发表格行的添加事件。在事件的回调函数中,我们首先获取当前行的DOM对象,然后创建一个class为`layui-table-cell`的DIV元素作为下菜单的容器,再在容器中创建一个select元素作为下菜单中的选项。最后,我们将下菜单添加到当前行的超链接后面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值