el-table多级嵌套列表,菜单使用el-switch代替

news2024/11/23 19:16:51

需求:根据el-table实现多级菜单复选,并且只要是菜单就不再有复选框,也没有全选按钮,一级菜单使用el-switch代替原有的列复选框,子级如果全部选中,那么父级的el-switch也会被选中,如下图,注意:这样写是没有列头的,列头的全选按钮一直获取不到它的checked的值,试了很多种还是不行,全选按钮只能全选反选实现不了,放弃了。

 1.后端数据

  1. 一定要后端给每个级别的菜单还有增删改查功能项都添加个checked:false
  2. 后端一定要用type或者是什么表示是菜单还是功能项
  3. 后端数据如下,多级的列表,type为0表菜单,为1表功能项
"data": [
		{
			"menu_id": 1,
			"menu_name": "仪表盘",
			"type": 0,
			"checked": false,
			"children": [
				{
					"menu_id": 17,
					"menu_name": "查看",
					"type": 1,
					"checked": false
				}
			]
		},
{
			"menu_id": 1,
			"menu_name": "用户管理",
			"type": 0,
			"checked": false,
			"children": [
				{
					"menu_id": 17,
					"menu_name": "查看",
					"type": 1,
					"checked": false,
                    "children": [
						{
							"menu_id": 31,
							"menu_name": "设备连接拓扑图隐藏或显示",
							"type": 1,
							"checked": false
						},
				}
			]
		},

2.el-table表格实现

  1. :data就是后端的数据
  2. row-key:行数据的key值,要是唯一值,不然报错
  3. :show-header=false不展示表头

  4. :tree-props="{ children: 'children', hasChildren: 'hasChildren' }",渲染嵌套数据的默认配置,通俗点就是,判断有没有children有就下一级自动渲染

  5. 主要是看第一个el-table-column的 type="selection"属性,这个属性就是添加复选框了,之后使用插槽的方式只要是type为0功能项才会添加el-checkbox复选框按钮,type为1的才是el-switch开关控制

       <el-table
            :data="tableData"
            row-key="menu_id"
            style="width: 100%"
            :show-header="false"
            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
          >
            <el-table-column
              type="selection"
              :selectable="selectable"
              width="50"
            >
              <template slot-scope="{ row }">
                <span v-if="row.type === 0"></span>
                <el-checkbox
                  v-model="row.checked"
                  v-else
                  @change="handleCheck(row.menu_id, row.checked, row)"
                ></el-checkbox>
              </template>
            </el-table-column>
            <el-table-column prop="menu_name" label="菜单" align="left">
            </el-table-column>
            <el-table-column label="操作" align="center">
              <template slot-scope="scope" v-if="scope.row.type == 0">
                <el-switch
                  v-model="scope.row.checked"
                  active-color="#13ce66"
                  inactive-text="全选"
                  @change="swictchange($event, scope.row)"
                >
                </el-switch>
              </template>
            </el-table-column>
          </el-table>

3.多级嵌套表单-单选-反选el-switch

如果子级的功能项都选中了那么直接反选子级的上一级的el-switch的开关,这边建议直接复制

这边传入的tabledata就是所有的数据,使用递归的方式实现的反选switch

 // 点击单行获取到数据,实现反选
    handleCheck() {
      this.setHandleCheck(this.tableData);
    },
    setHandleCheck(menuList) {
      // checked变量初始化为true
      let checked = true;
      // 遍历菜单列表的每一个菜单,
      for (let i = 0; i < menuList.length; i++) {
        // []中的每一个对象存储在menu
        const menu = menuList[i];
        // 如果菜单中有子菜单,那么就递归重新调用菜单来更新子菜单的checked属性
        if (menu.children && menu.children.length > 0) {
          menu.checked = this.setHandleCheck(menu.children);
        }
        // 判断初始值和menu.checked的值是否为ture
        checked = checked && menu.checked;
      }
      return checked;
    },

4.el-switch控制全选子级,子级单选没选完之后再点击switch会全选

    // 开关状态
    swictchange(flag, row) {
      this.setLastRight(row, this.menulistReq, flag);
      console.log(this.menulistReq, "递归得到的值");
      this.setHandleCheck(this.tableData);
    },
    // 递归全选
    setLastRight(obj, arr, flag) {
      if (!obj.children) {
        return;
      }
      // 当前对象要是没有children,就遍历children
      obj.children.forEach((item) => {
        item.checked = flag;
        // 传递俩个实参,item在一二级都是有chilren,所以会一直调用到最后一级,最后一级是没呀chiren
        this.setLastRight(item, arr, flag);
      });
    }

5.提交权限

这样就实现多级全选反选了,最后用el-button按钮提交权限,接口什么的每个人封装的不一样哈,写法可能有点出入,我在提交的时候是提交menu_id,只需要在最后遍历一遍表格数据,根据checked为true的吧menu_id添加到数组就行了,之后再传给后端

    // 分配角色权限
    async allotPermission() {
      this.recursionChecedTrue(this.tableData);
  const menu = [...new Set(this.menulistReq)];
      const res = await SetRoleManage({
        menu_ids: menu,
        id: this.copyrole.id_1,
      });
      if (res.code == 200) {
        this.$message.success("角色分配成功");
      }
    },
    // 递归获取所有checked为ture的值
    recursionChecedTrue(tableData) {
      tableData.forEach((item) => {
        if (item.checked) {
          this.menulistReq.push(item.menu_id);
        }
        if (item.children) {
          this.recursionChecedTrue(item.children);
        }
      });
    },

文章到此结束,希望对你有所帮助~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年微单相机市场电商数据分析(京东数据查询分析)

5月10日&#xff0c;尼康发布了Z8微单相机&#xff0c;首发价格27999元。规格、性能等都可以看到官方的详细讲解。不过从目前业内人士以及数码爱好者的评价来看&#xff0c;Z8的配置匹配27999元的价格是比较有优势的。 并且有很多人表示&#xff0c;Z8一经推出很有可能会对自身…

6. N 字形变换

将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H NA P L S I I GY I R 之后&#xff0c;你的输出需要从左往右逐…

mysql查询列添加序号

添加序号查询结果 # 每次值1 # 值从0开始 SELECT (i:i1) AS 序号,user.* FROM user, (SELECT i:0) AS itable;

【Java多线程编程】解决线程的不安全问题

前言&#xff1a; 当我们进行多线程编程时候&#xff0c;多个线程抢占系统资源就会造成程序运行后达不到想要的需求。我们可以通过 synchronized 关键字对某个代码块或操作进行加锁。这样就能达到多个线程安全的执行&#xff0c;因此我把如何使用 synchronized 进行加锁的操作…

ChatGPT插件推荐,效率提升100倍!

在浏览器上使用ChatGPT时&#xff0c;借助一些插件可以帮助我们更便捷的获取消息&#xff0c;比如&#xff1a; 在搜索引擎搜索东西的同时和ChatGPT对话&#xff1b; 同一个问题同时向ChatGPT、newBing、Claude 等多个模型提问获取结果&#xff1b; 让ChatGPT可以联网获取最新…

实时聊天如何做,让客户眼前一亮(一)

网站上的实时聊天功能应该非常有用&#xff0c;因为它允许客户支持立即帮助用户。在线实时聊天可以快速轻松地访问客户服务部门&#xff0c;而它也代表着企业的门面。 让我们讨论一下如何利用SaleSmartly&#xff08;ss客服&#xff09;在网站中的实时聊天视图如何提供出色的实…

Yolov8改进:小目标到大目标一网打尽,轻骨干重Neck的轻量级目标检测器GiraffeDet

1.GiraffeDet介绍 论文:https://arxiv.org/abs/2202.04256 🏆🏆🏆🏆🏆🏆Yolov8魔术师🏆🏆🏆🏆🏆🏆 ✨✨✨魔改网络、复现前沿论文,组合优化创新 🚀🚀🚀小目标、遮挡物、难样本性能提升 🍉🍉🍉定期更新不同数据集涨点情况 本文是阿里巴…

【Autoware】Open Planner代码分析

目录 包结构op_global_plannerop_global_planner_core.cpp中代码的主要逻辑 op_local_plannerop_trajectory_generatorop_behavior_selectorop_common_paramsop_motion_predictorop_trajectory_evaluator 本篇主要对Open Planner的代码进行分析&#xff0c;主要包括op_global_p…

FSS对象存储挂载到windows云服务器操作方法

FSS对象存储可以挂载到云主机中用于存储视频、备份等不需要 经常读写的大文件。不适合存放数据库等对IO需求较高、经常读写的场景。 1、远程登陆服务器&#xff0c;打开控制面板&#xff0c;然后点击“打开或关闭windows功能”。 windows2008系统&#xff1a; 选择“功能”-- …

图可视化工具Gephi使用教程

图可视化工具Gephi使用教程 操作界面介绍在Gephi界面完成图的绘制键盘输入导入CSV文件直接在概览界面鼠标点击创建自己创建一个红楼梦关系网络图用一个Web of Science上的数据创建一个有向关系图 静态随机数据使用动态数据的使用Gephi的可视化处理节点移动节点放大&缩小单个…

【JAVA程序设计】(C00133)基于SSM的勤工助学管理系统

基于SSM的勤工助学管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统为基于SSM的学生勤工助学俭学管理系统&#xff0c;本系统分为三种角色&#xff1a;管理员、学生、用人单位&#xff1b; 管理员功能&#xff1a;个人中心、面试邀请管理、岗位报名管理、…

二十三:创建交易

功能需求&#xff1a; 用户在交易主页面&#xff0c;点击”创建”按钮&#xff0c;跳转到创建交易的页面&#xff1b; 用户在创建交易的页面填写表单&#xff0c;点击”保存”按钮&#xff0c;完成创建交易的功能。 *所有者、阶段、类型、来源 都是动态的 *市场活动源是可搜…

《编程思维与实践》1061.计算n!右端0的个数(II)

《编程思维与实践》1061.计算n!右端0的个数(II) 题目 思路 可以用大整数的乘法来处理,不过有些题目可以用数论的方法得到更方便的做法, 以本题为例: 注意到 10 2 ⋅ 5 102\cdot 5 102⋅5 , 所以只需要将阶乘的每一项分解成2和5的乘积形式即可, 同时由于每出现一个5,必然会出现…

shell补充命令

目录 排序sort命令 语法格式: 常用选项: 去重uniq命令 替换tr命令 替换字符 删除​编辑 压缩​编辑 压缩替换​编辑 删除空行 截取cut命令 拆分split命令 合并paste命令​ eval命令 排序sort命令 以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型…

淘天集团首战618,一场平台生态的“再创业”

电商行业还在“卷”&#xff0c;但不是所有人都还把目光放在低价、噱头上。 5月10日&#xff0c;淘宝天猫618商家大会应时而至&#xff0c;随之而来的&#xff0c;是“淘天集团”的首次公开亮相。淘天集团CEO戴珊表示&#xff0c;“新生变革”、自我变革不是选择题而是必答题。…

4.实现csdn暗黑模式-油猴脚本实战1

4.实现csdn暗黑模式-油猴脚本实战1 Start 前面的文章&#xff0c;对油猴脚本做了基础的介绍。今天来我们来实战一下&#xff0c;编写一个有实际作用的油猴脚本。 如果我希望我的csdn是暗黑模式&#xff0c;怎么办&#xff1f; 看我表演&#xff1f; 注意&#xff01;本文仅用…

shell脚本----正则表达式

文章目录 一、什么是正则表达式二、正则表达式的使用 一、什么是正则表达式 正则表达式是由普通字符与元字符组成&#xff1a; 普通字符 包括大小写字母、数字、标点符号及一些其他符号。 元字符 是指在正则表达式中具有特殊意义的专用字符&#xff0c;可以用来规定其前导字符…

科技助农 智慧养鸡2D组态可视化管理云平台

前言 养殖业是农业的一个重要分支&#xff0c;主要包括家禽养殖、畜牧养殖和水产养殖三个细分产业。养殖业发展至今&#xff0c;已成为与种植业并列的农业两大支柱产业之一。 建设背景 我国作为养殖业大国&#xff0c;各类型的散养农户、大中小型养殖场数量极多&#xff0c;…

事务的隔离级别有哪几种,解决了什么问题?

事务的隔离级别主要是为了保证多事务环境下的并发安全性&#xff0c;共有四大隔离级别&#xff0c;如下&#xff1a; 如果不考虑隔离性&#xff0c;在SQL操作中&#xff0c;多个事务竞争可能会产生三种不同的现象&#xff0c;分别是脏读、幻读、不可重复读。 首先来看脏读&am…

slf4j log4j log4j-over-slf4j self-log4j12

一、Java日志体系概述 图1-1 Java日志体系概况 日志门面接口&#xff08;SLF4J、JCL&#xff09;一系列绑定和桥接具体的日志实现 先来两个例子&#xff1a; Spring项目中通过Commons Logging直接使用log4j 图1-2 通过Commons Logging使用log4j本例中由于spring-core中原生依…