【树形权限】树形列表权限互斥选择、el-tree设置禁用等等

文章目录

    • 一、实现如上树形列表
      • 1.1 首先要就是渲染树形列表
      • 1.2 然后通过插槽处理头部标题
      • 1.3 再通过插槽处理表格body体内容
      • 1.4 让body体中的选框和表头中的选框产生关联
    • 二、将 el-tree 整棵树设为禁用状态
    • 三、动态表格合并

需求:按照权限管理配置的数据权限树展开;点击查看按钮后进入其他指定机构选择弹窗为一树形结构
在这里插入图片描述
本文章对项目中出现得关键点进行总结。

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

一、实现如上树形列表

在 element 官方表格示例中,实现树形表格列表数据渲染,非常简单。只需要按部就班,替换相关的数据即可。
但是很明显,我们这个项目中的需求,除了树形列表外,还有一些非常规的需求(😓想拿板砖拍死产品🤯的心都有了,有没有想过开发啥感受😶,好不好实现🤢!)。没有办法,还是得硬着头皮上,谁让咱没有话语权,说干就干,着手研究。这个过程一定要跟后端商量好交互的数据格式,不然自己干自己的,你最后会很痛苦(PS:最好有一个靠谱的经验丰富的后端来配合你,能让你节省很多时间,少走很多弯路)。

1.1 首先要就是渲染树形列表

很简单,直接贴代码

<el-table:data="tableData"style="width: 100%"row-key="id"lazy:tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-column type="index" label="序号"></el-table-column><el-table-column prop="name" label="名称"></el-table-column><el-table-column prop="one_level"></el-table-column><el-table-column prop="two_level"></el-table-column><el-table-column prop="three_level"></el-table-column><el-table-column prop="four_level"> </el-table-column><el-table-column prop="operation" label="其他指定机构"></el-table-column>
</el-table>

1.2 然后通过插槽处理头部标题

这里的数据只需要渲染名称一行,后面全部都是选框,所以就是头部那里也需要重新去搞一下。
el-table 本身是带有 type=checkbox 属性来实现复选功能的,当时就尝试了四个,但是你需要实现互斥关系,并且还需要加一些文字,自带的就多少有点不够用了。
所以这个使用采用插槽 #header 去重写头部,并使用 el-radio 填充,实现单选互斥效果,代码如下:

<el-table:data="tableData"style="width: 100%"row-key="id"lazy:tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-column type="index" label="序号"></el-table-column><el-table-column prop="name" label="名称"></el-table-column><el-table-column prop="one_level"><template #header><div><el-radio v-model="tableHeader.level" label="1" @change="headerChange(1)">一级组织机构内所有数据</el-radio></div></template></el-table-column><el-table-column prop="two_level"><template #header><div><el-radiov-model="tableHeader.level"label="2"@change="headerChange(2)">本级组织机构及下属组织机构数据</el-radio></div></template></el-table-column><el-table-column prop="three_level"><template #header><div><el-radio v-model="tableHeader.level" label="3" @change="headerChange(3)">本账号及下属组织机构数据</el-radio></div></template></el-table-column><el-table-column prop="four_level"><template #header><div><el-radio v-model="tableHeader.level" label="4" @change="headerChange(4)">本账号数据</el-radio></div></template></el-table-column><el-table-column prop="operation" label="其他指定机构"></el-table-column>
</el-table>

1.3 再通过插槽处理表格body体内容

同样,body体通过默认插槽配置对应的内容和选框,这个时候我采用的是el-checkbox,通过样式穿透改其样式让它在页面看起来更加符合产品设计要求。代码如下:

    <el-table:data="tableData"style="width: 100%"row-key="id"lazy:tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-column type="index" label="序号"></el-table-column><el-table-column prop="name" label="名称"></el-table-column><el-table-column prop="one_level"><template #header><div><el-radio v-model="tableHeader.level" label="1" @change="headerChange(1)">一级组织机构内所有数据</el-radio></div></template><template #default="{row, column, $index}"><div><el-checkboxv-model="tableHeader['one_level'+$index]":checked="checked['one_level'+$index]":label="column.property+$index":disabled="cutIdx !== 1"@change="itemChange(column.property+$index, $index)">勾选 {{$index}}~{{row.id}}</el-checkbox></div></template></el-table-column><el-table-column prop="two_level"><template #header><div><el-radiov-model="tableHeader.level"label="2"@change="headerChange(2)">本级组织机构及下属组织机构数据</el-radio></div></template><template #default="{row, column, $index}"><div><el-checkboxv-model="tableHeader['two_level'+$index]":checked="checked['two_level'+$index]":label="column.property+$index":disabled="cutIdx !== 2"@change="itemChange(column.property+$index, $index)">勾选 {{$index}}~{{row.id}}</el-checkbox></div></template></el-table-column><el-table-column prop="three_level"><template #header><div><el-radio v-model="tableHeader.level" label="3" @change="headerChange(3)">本账号及下属组织机构数据</el-radio></div></template><template #default="{row, column, $index}"><div><el-checkboxv-model="tableHeader['three_level'+$index]":checked="checked['three_level'+$index]":label="column.property+$index"@change="itemChange(column.property+$index, $index)":disabled="cutIdx !== 3">勾选 {{$index}}~{{row.id}}</el-checkbox></div></template></el-table-column><el-table-column prop="four_level"><template #header><div><el-radio v-model="tableHeader.level" label="4" @change="headerChange(4)">本账号数据</el-radio></div></template><template #default="{row, column, $index}"><div><el-checkboxv-model="tableHeader['four_level'+$index]":checked="checked['four_level'+$index]":label="column.property+$index"@change="itemChange(column.property+$index, $index)":disabled="cutIdx !== 4">勾选 {{$index}}~{{row.id}}</el-checkbox></div></template></el-table-column><el-table-column prop="operation" label="其他指定机构"><template #default><el-button type="success" size="mini">查看</el-button></template></el-table-column>
</el-table>

1.4 让body体中的选框和表头中的选框产生关联

表头互斥,代表这一但选中其中一个表头,只能选择body体中当前列的选框内容,这个时候我根据表头的选择,禁用非当前列。
当然,如果有特殊需求,你可以适当的自己修改一下。

headerChange(idx) {if (this.cutIdx !== idx) {this.ids.forEach((_, i) => {if (this.checked[this.cutIdx]) {this.$nextTick(() => {this.$set(this.tableHeader,i + this.levelMap.get(this.cutIdx),false)this.$set(this.checked, this.levelMap.get(this.cutIdx) + i, false)})}})this.cutIdx = idxconsole.log(idx, this.tableHeader, this.levelMap.get(idx), '不同列')}// 清空所有for (const key in this.tableHeader) {if (key !== 'level') {console.log(key, 123123)this.$nextTick(() => {this.$set(this.tableHeader, key, false)this.$set(this.checked, key, false)})}}// 当前下面所有都选中this.ids.forEach((_, i) => {// console.log(levelMap.get(idx) + i)this.$nextTick(() => {this.$set(this.tableHeader, this.levelMap.get(idx) + i, true)this.$set(this.checked, this.levelMap.get(idx) + i, true)console.log(this.tableHeader,this.checked[this.levelMap.get(idx) + i])})})},itemChange(item, idx) {console.log(item, idx, this.checked[item])// this.tableHeader[idx] = truelet _this = thisthis.$nextTick(() => {if (this.checked[item]) {_this.$set(this.checked, item, false)for (const key in this.tableHeader) {if (key === 'level') {this.tableHeader[key] = ''}}} else {_this.$set(this.checked, item, true)}const res = this.ids.every((_, i) => {return this.checked[this.levelMap.get(this.cutIdx) + i] === true})if (res) {for (const key in this.tableHeader) {if (key === 'level') {this.tableHeader[key] = this.cutIdx + ''// this.$set(this.tableHeader, key, this.cutIdx + '')console.log(key, this.levelMap.get(this.cutIdx), this.tableHeader)}}}})},// 递归获取idsgetIds(data) {data.forEach(v => {this.ids.push(v.id)if (v.children && v.children.length > 0) {this.getIds(v.children)}})}

二、将 el-tree 整棵树设为禁用状态

element 官方给出的示例中,是给部分 tree 节点通过 disabled 属性设置禁用状态。它所写的仅是一段静态代码,如果是后端返回得数据很多,我们想要在查看状态下禁用所有树形节点,显然非常麻烦,需要处理大量的数据。
所以这里通过巧用 props 属性,来实现树形节点的禁用效果。

<el-treeref="permissionTree":data="permissionTree":show-checkbox="showCheckbox"node-key="keyId":props="defaultProps">
</el-tree>
data() {return {defaultProps: {label: 'labelName',children: 'childrenList',disabled: this.isDisabled,}}
},
methods: {isDisabled() {return this.$route.params.type === 'view' ? true : false;}
}

三、动态表格合并

一些项目中,需要使用到 elementUI table 组件的方法 :span-method=“objectSpanMethod” 进行单元格的动态合并。查看了官方 API 后,发现简单、直白、明了,无法满足下图业务的需求。所以参考了一些其他的网络资料,具体的思路:在动态处理从后端拿回来的数据的时候,是需要从数据中找到一个唯一的“标识”去判断是否是相同种类的数据。然后根据这个“标识”去做逻辑判断。
在这里插入图片描述

  1. 首先需要在 data 中定义需要数据,根据数组中存储的标识去合并数据

    data() {return {// 合并单元格需要的数据spanArr: [], //遍历数据时,根据相同的标识去存储记录pos: 0, // 二维数组的索引};},
    
  2. 然后在 methods 中定义方法去处理标识(需要合并的数据单元格)

    methods: {// 列表数据处理函数getSpanArr(data) {//页面展示的数据,不一定是全部的数据,所以每次都清空之前存储的 保证遍历的数据是最新的数据。以免造成数据渲染混乱this.spanArr = [];this.pos = 0;//遍历数据data.forEach((item, index) => {//判断是否是第一项if (index === 0) {this.spanArr.push(1);this.pos = 0;} else {//不是第一项时,就根据标识去存储if (data[index].sdTarget === data[index - 1].sdTarget) {// 查找到符合条件的数据时每次要把之前存储的数据+1this.spanArr[this.pos] += 1;this.spanArr.push(0);} else {// 没有符合的数据时,要记住当前的indexthis.spanArr.push(1);this.pos = index;}}});console.log(this.spanArr, this.pos);},// 指定合并的单元格函数objectSpanMethod({ row, column, rowIndex, columnIndex }) {// 页面列表上 表格合并行 -> 第几列(从0开始)// 需要合并多个单元格时 依次增加判断条件即可if (columnIndex === 0) {// 二维数组存储的数据 取出const _row = this.spanArr[rowIndex];const _col = _row > 0 ? 1 : 0;return {rowspan: _row,colspan: _col,};//不可以return {rowspan:0, colspan: 0} 会造成数据不渲染, 也可以不写else,eslint过不了的话就返回false} else {return false;}},},
  3. 最后在 created 或 mounted 中调用处理函数将异步获取到的数据传递过去进行处理:

    mounted() {this.tableData = …. //异步获取数据this.getSpanArr(this.tableData);
    },
    

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

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

相关文章

如何利用客户旅程打造好的用户体验?

在当今竞争激烈的市场中&#xff0c;提供卓越的用户体验已经成为企业脱颖而出的关键因素之一。客户旅程是实现出色用户体验的有力工具之一&#xff0c;而HubSpot的客户旅程规划功能为企业提供了强大的支持&#xff0c;帮助他们更好地理解、管理和改善客户的互动过程。今天运营坛…

【USRP】调制解调系列5:16QAM、32QAM、64QAM、256QAM、1024QAM、基于labview的实现

QAM 正交振幅键控是一种将两种调幅信号&#xff08;2ASK和2PSK&#xff09;汇合到一个信道的方法&#xff0c;因此会双倍扩展有效带宽&#xff0c;正交调幅被用于脉冲调幅。正交调幅信号有两个相同频率的载波&#xff0c;但是相位相差90度&#xff08;四分之一周期&#xff0c…

参编三大金融国标,奇富科技以技术促行业规范化演进

近期&#xff0c;由中国互联网金融协会领导制定的《互联网金融智能风险防控技术要求》《互联网金融个人网络消费信贷信息披露》《互联网金融个人身份识别技术要求》三项国家标准颁布&#xff0c;由国家市场监督管理总局、国家标准化管理委员会发布&#xff0c;奇富科技作为核心…

Flutter 混合开发调试

针对Flutter开发的同学来说&#xff0c;大部分的应用还是Native Flutter的混合开发&#xff0c;所以每次改完Flutter代码&#xff0c;运行整个项目无疑是很费时间的。所以Flutter官方也给我们提供了混合调试的方案【在混合开发模式下进行调试】&#xff0c;这里以Android Stud…

OPENCV实现图像查找

特征匹配+单应性矩阵 # -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/4 """ import cv2 import numpy as np# 读图像 img1 = cv2.imread(F:\\learnOpenCV\\openCVLearning\\pictures\\chess

【HTML5高级第一篇】Web存储 - cookie、localStorage、sessionStorage

文章目录 一、数据存储1.1 cookie1.1.1 概念介绍1.1.2 存储与获取1.1.3 方法的封装1.1.4 总结 1.2 localstorage 与 sessionstorage1.2.1 概述1.2.2 操作数据的属性或方法1.2.3 案例-提交问卷1.2.4 Web Storage带来的好处 附录&#xff1a;1. HTML5提供的数据持久化技术&#x…

万里路,咫尺间:汽车与芯片的智能之遇

目前阶段&#xff0c;汽车产业有两个最闪耀的关键词&#xff0c;就是智能与低碳。 在践行双碳目标与产业智能化的大背景下&#xff0c;汽车已经成为了能源技术、交通技术、先进制造以及通信、数字化、智能化技术的融合体。汽车的产品形态与产业生态都在发生着前所未有的巨大变革…

Hadoop的概述与安装

Hadoop的概述与安装 一、Hadoop内部的三个核心组件1、HDFS&#xff1a;分布式文件存储系统2、YARN&#xff1a;分布式资源调度系统3、MapReduce&#xff1a;分布式离线计算框架4、Hadoop Common&#xff08;了解即可&#xff09; 二、Hadoop技术诞生的一个生态圈数据采集存储数…

C语言:递归思想及实例详解

简介&#xff1a;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。通过函数的自调用化繁为简。 递归可以说是编程中最神奇的一种算法。因为我们有时候可能不能完全明晰代码的运行过程&#xff0c;但是我们却知道代码可以跑出正确的结果。而当我们使…

qt day 6

登录界面 #include "window.h" #include<QDebug> #include<QIcon> Window::Window(QWidget *parent) //构造函数的定义: QWidget(parent) //显性调用父类的构造函数 {//判断数据库对象是否包含了自己使用的数据库Student.dbif(!db.contains(&…

微波系统中散射参量S、阻抗参量Z及导纳参量Y之间的关系及MATLAB验证

微波系统中散射参量S、阻抗参量Z及导纳参量Y之间的关系及MATLAB验证 用HFSS设计了一微波元件&#xff0c;仿真出了其散射参量S、阻抗参量Z及导纳参量Y&#xff0c;用MATLAB验证他们之间的关系 HFSS设计螺旋线圈 用HFSS设计了一个螺旋线圈&#xff0c;如上图所示。 进行仿真&…

8K视频来了,8K 视频编辑的最低系统要求

当今 RED、Canon、Ikegami、Sony 等公司的 8K 摄像机以及 8K 电视&#xff0c;许多视频内容制作人和电影制作人正在认真考虑 8K 拍摄、编辑和后期处理&#xff0c;需要什么样的系统来处理如此海量的数据&#xff1f; 中央处理器&#xff08;CPU&#xff09; 首先&#xff0c;…

Spring Security安全登录的调用过程以及获取权限的调用过程

1.第一次登录时候调用/user/login整个流程分析 (0)权限授理 首先调用SecurityConfig.java中的config函数将jwtAuthenticationTokenFilter过滤器放在UsernamePasswordAuthenticationFilter之前 Override protected void configure(HttpSecurity http) throws Exception{......…

FinClip 支持创建 H5应用类小程序;PC 终端 优化升级

FinClip 的使命是使您能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型。不妨让我们看看本月产品与市场发布亮点&#xff0c;是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f447;&#x1f447; FinClip 支持创建 H5应用类小程序 近期我们…

MongoDB常用的比较符号和一些功能符号

比较符号 results collection.find({age: {$gt: 20}})功能符号 results collection.find({name: {$regex: ^M.*}})

怎么把pdf转换成高清图片?

怎么把pdf转换成高清图片&#xff1f;最近&#xff0c;我的同事遇到了一个问题&#xff0c;现在她需要将一些pdf文件转换成高清的图片&#xff0c;这件事情让让她感到非常无助&#xff0c;因为她非常着急需要将这些文件转换为图片格式&#xff0c;以便更好的在今后的工作中进行…

Ubuntu 22.04.2 LTS 安装python3.6后报错No module named ‘ufw‘

查明原因&#xff1a; vim /usr/sbin/ufw 初步判断是python版本的问题。 # 查看python3软链接 ll /usr/bin/python3 将python3的软链接从python3.6换成之前的3.10&#xff0c;根据自己电脑情况。 可以查看下 /usr/bin 下有什么 我这是python3.10 所以解决办法是 # 移除py…

工业互联网龙头企业研祥智能加入 openKylin

导读近日&#xff0c;研祥智能科技股份有限公司&#xff08;以下简称 “研祥智能”&#xff09;签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入 openKylin 开源社区。 研祥智能于 1993 年 12 月 31 日成立…

如何让insert程序速度快,可以试试联合SQL(insert 和 select 一起使用)?

查询添加可选择SQL执行&#xff0c;速度远超程序执行 insert 和 select案例 insert into 表1(列1,列2,列3,...) select 列1,列2,列3,...from表2(GROUP BY 列)116511 条数据 耗时45秒&#xff0c; 如果是程序查询然后再insert&#xff0c;则需要30分钟左右&#xff01;&#x…

Server - PyTorch BFloat16 “TypeError: Got unsupported ScalarType BFloat16“ 解决方案

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132665807 BFloat16 类型是 16 位的浮点数格式&#xff0c;可以用来加速深度学习的计算和存储。BFloat16 类型的特点是保留 32 位浮点数&#xff…