当前位置: 首页 > 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="selectList.length==allData.length" @change="checkAll"> 全选 </div><div v-for="item in data" :key="item.id"><input type="checkbox" :checked="selectList.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="selectList.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="selectList.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},]}]}],allData: [],selectList: [],},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.selectList.lengthif (!all) {this.selectList = this.allData.map(res => { return { id: res.id }; })} else {this.selectList = []}},//选中toggleCheckbox(item) {let index = this.selectList.findIndex(res => { return res.id == item.id })let flag = falseif (index == -1) {this.selectList.push({ id: item.id })flag = true} else {this.selectList.splice(index, 1)}if (item.children) {this.toggleChildren(item, flag);}if (item.parentId) {this.toggleParents(item.parentId);}},//所有子级选中toggleChildren(item, flag) {item.children.forEach((child, inx) => {let index = this.selectList.findIndex(res => { return res.id == child.id })if (flag) {if (index == -1) {this.selectList.push({ id: child.id })}} else {this.selectList.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.selectList.findIndex(res => { return res.id == arr[i].id })if (index == -1) { this.selectList.push({ id: arr[i].id }); }if (arr[i].children) {this.toggleParents(arr[i].parentId)}}}},}});</script>
</body></html>


http://www.mrgr.cn/news/17801.html

相关文章:

  • HMI触屏网关-VISION如何与Modbus TCP从机通信
  • 深度干货 | 以NDR为主线,深度解析纷享销客融资背后的经营与价值
  • 前端Flex布局常见的几个问题
  • 中资优配:白马股跌出性价比 基金经理公开唱多
  • 计算机毕业设计选题推荐-办公楼物业管理系统-Java/Python项目实战
  • docker 介绍以及常用命令
  • RTP协议
  • 基于zigbee的广告牌安全监测系统设计与实现(论文+源码)
  • 《黑神话:悟空》:文化与技术的碰撞与数字创作的新方向
  • Nginx安全性配置
  • TensorFlow创建回归神经网络及Optimizer优化器
  • H264编码
  • 大模型微调中的内存效率问题及解决方案
  • 【Docker镜像转存阿里云脚本】
  • 开启ROS 2中的geometry坐标模拟展示
  • 基础闯关3
  • K8s系列之:Operator 和 Operator Framework
  • C#绘制常用工业控件(仪表盘,流动条,开关等)
  • Android图片缓存工具类LruCache原理和使用介绍
  • K8s系列之:解释Kubernetes Operators