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

2024-09-03 19:28

本文主要是介绍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>

这篇关于VUE 实现三级权限选中与全选的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133828

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到