当前位置: 首页 > news >正文

VUE 实现三级权限选中与全选

功能:点击全选时所有子级选中,点击子级时对应的所有父级要选中。

实现思路:通过递归将所有子级转化为一级,选中时将选中的ID存为一个二级数组。循环时判断当前项在选中的数组中存在时即为勾选状态。

1、所有子级选中:通过递归的形式查找所有子级并且将它保存为一个二维数组,只保存ID即可。this.selectList = [{id:1},{id:2}]

2、所有父级选中:选择某个子级时判断是否有父级,有父级则将所有父级选中,这时候就用到我们一开始的树形结构转化的一级所有节点。

具体代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>VUE实现三级权限复选框</title><script src="https://cdn.jsdelivr.net/npm/vue@2"></script><style>* {padding: 0px;padding: 0px;}body {font-size: 12px;}</style>
</head><body><div id="app"><div><input type="checkbox" :checked="selectIds.length==allData.length" @change="checkAll"> 全选 </div><div v-for="item in data" :key="item.id"><input type="checkbox" :checked="selectIds.some(res=>res.id==item.id)" @change="toggleCheckbox(item)"><label>{{ item.name }}</label><div style="padding-left:20px;" v-if="item.children"><div v-for="child in item.children" :key="child.id"><input type="checkbox" :checked="selectIds.some(res=>res.id==child.id)" @change="toggleCheckbox(child)"><label>{{ child.name }}</label><div style="display:flex;" v-if="child.children"><div style="margin-left:20px;" v-for="grandChild in child.children" :key="grandChild.id"><input type="checkbox" :checked="selectIds.some(res=>res.id==grandChild.id)" @change="toggleCheckbox(grandChild)"><label>{{ grandChild.name }}</label></div></div></div></div></div></div><script>new Vue({el: '#app',data: {data: [{name: '用户管理',id: 1,parentId: 0,children: [{id: 2,name: '用户列表',parentId: 1,children: [{id: 3,name: '添加',parentId: 2},{id: 4,name: '删除',parentId: 2},{id: 5,name: '禁用',parentId: 2}]},{id: 6,name: '积分列表',parentId: 1,children: [{id: 7,name: '添加',parentId: 6},{id: 8,name: '删除',parentId: 6},]}]},{name: '课程管理',id: 9,parentId: 0,children: [{id: 10,name: '课程列表',parentId: 9,children: [{id: 11,name: '添加',parentId: 10},{id: 12,name: '删除',parentId: 10},{id: 13,name: '禁用',parentId: 10}]},{id: 14,name: '课程订单',parentId: 9,children: [{id: 15,name: '添加',parentId: 14},{id: 16,name: '删除',parentId: 14},]}]}],allData: [],selectIds: [],},mounted() {this.getAlldata(this.data);},methods: {//全部转化为一级getAlldata(arr) {arr.forEach(res => {this.allData.push(res)if (res.children) {this.getAlldata(res.children)}})},//全选checkAll() {let all = this.allData.length == this.selectIds.lengthif (!all) {this.selectIds = this.allData.map(res => { return { id: res.id }; })} else {this.selectIds = []}},//选中toggleCheckbox(item) {let index = this.selectIds.findIndex(res => { return res.id == item.id })let flag = falseif (index == -1) {this.selectIds.push({ id: item.id })flag = true} else {this.selectIds.splice(index, 1)}if (item.children) {this.toggleChildren(item, flag);}if (item.parentId!=0) {this.toggleParents(item.parentId);}},//所有子级选中toggleChildren(item, flag) {item.children.forEach((child, inx) => {if(flag){let index = this.selectIds.findIndex(res=>{ return res.id==child.id})if(index==-1){this.selectIds.push({id:child.id})}}else{this.selectIds.forEach((res,index)=>{if(res.id==child.id){ this.selectIds.splice(index, 1);  }})}if (child.children) {this.toggleChildren(child, flag);}});},//选中子级时递归查找父级选中toggleParents(parentId) {let arr = this.allDatafor (let i = 0; i < arr.length; i++) {if (arr[i].id == parentId) {let index = this.selectIds.findIndex(res => { return res.id == arr[i].id })if (index == -1) { this.selectIds.push({ id: arr[i].id }); }if (arr[i].children) {this.toggleParents(arr[i].parentId)}}}},}});</script>
</body></html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp h5项目页面中使用了iframe导致浏览器返回按键无法使用, 返回不了上一页.
  • 【Python 第六篇章】字符操作和读取文件
  • 解决npm下载依赖速度慢的问题
  • 对称密码学
  • 微信小程序:最近三天,当日昨日,当月,上月其他时间可以参考思路
  • 全桥整流器简介
  • Oracle手动误删物理上的数据文件解决办法
  • 【Linux】:用户缓冲区
  • 更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】
  • js发送邮件:如何在Node.js实现邮件发送?
  • vue 批量导出pdf 压缩包 zip
  • Location-Aware Self-Supervised Transformers for Semantic Segmentation
  • 最新保姆级教程
  • 车窗边缘上的装饰边和花点的作用
  • 废品回收小程序,从传统到现代化的回收模式
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • ES6--对象的扩展
  • express如何解决request entity too large问题
  • Java 多线程编程之:notify 和 wait 用法
  • jdbc就是这么简单
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • OSS Web直传 (文件图片)
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue.js-Day01
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初识 webpack
  • 盘点那些不知名却常用的 Git 操作
  • 微信支付JSAPI,实测!终极方案
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在electron中实现跨域请求,无需更改服务器端设置
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​浅谈 Linux 中的 core dump 分析方法
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (19)夹钳(用于送货)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (算法二)滑动窗口
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)深入super,看Python如何解决钻石继承难题
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET C# 配置 Options
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net FrameWork简介,数组,枚举
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net的socket示例
  • .Net面试题4
  • .Net小白的大学四年,内含面经
  • @SpringBootApplication 注解