antd+vue:tree组件:父级节点禁止选择并不展示选择框——基础积累

antd+vue:tree组件:父级节点禁止选择并不展示选择框——基础积累

  • 1.判断哪些是父节点,给父节点添加`disabled`属性——this.permissionList是数据源
  • 2.通过css样式来处理`disabled`的父节点
  • 3.完整代码如下:

最近在写后台管理系统的时候,遇到一个需求:就是权限管理,一般权限管理根据功能分类,是会分不同级别的。

效果图如下:

在这里插入图片描述
今天后端提了一个需求,如下:就是无论是哪一层的父级节点,都不展示选择框,仅仅当作一个折叠项目展示。

原话:这一层权限能改成不需要勾选么?就当个分组用
在这里插入图片描述
最终的效果图如下:
在这里插入图片描述
解决思路:

1.判断哪些是父节点,给父节点添加disabled属性——this.permissionList是数据源

通过递归的方法来判断是否是父节点。

filterMenuList(arr, item) {
  arr.forEach((child) => {
    if (child.children && child.children.length > 0) {
      child.disabled = true;
      child = this.filterMenuList(child.children, item);
    }
  });
  return item;
},

使用递归方法:

this.permissionList.forEach((item) => {
  if (item.permissions && item.permissions.length > 0) {
    item = this.filterMenuList(item.permissions, item);
  }
});

通过上面的方法,可以给父节点添加disabled为true的属性了。
在这里插入图片描述

2.通过css样式来处理disabled的父节点

/deep/li.ant-tree-treenode-disabled
  > span.ant-tree-checkbox.ant-tree-checkbox-disabled {
  display: none !important;
}
/deep/
  .ant-tree
  li.ant-tree-treenode-disabled
  > .ant-tree-node-content-wrapper
  > span {
  color: rgba(0, 0, 0, 0.65) !important;
}

3.完整代码如下:

<template>
  <a-modal
    title="编辑API权限"
    :visible.sync="visible"
    :width="800"
    :maskClosable="true"
    @cancel="handleClose"
    @ok="handleSubmit"
  >
    <div id="topId"></div>
    <a-tabs tab-position="left">
      <a-tab-pane
        forceRender
        v-for="(group, index) in permissionList"
        :key="index + 1"
        :tab="group.displayName"
      >
        <a-tree
          ref="permissionTree"
          v-model="group.value"
          checkable
          checkStrictly
          :defaultExpandAll="true"
          :treeData="group.permissions"
          :replaceFields="replaceFields"
          @check="onCheck($event, group)"
        >
        </a-tree>
      </a-tab-pane>
    </a-tabs>
  </a-modal>
</template>
<script>
import { putApiPermission } from '@/services/menu';
export default {
  name: 'addPermissionList',
  components: {},
  data() {
    return {
      visible: false,
      loadLoading: false,
      permissionList: [],
      id: undefined,
      replaceFields: {
        value: 'permissionName',
        title: 'displayName',
        children: 'children',
        key: 'permissionName',
      },
      menuRoteIds: [],
    };
  },
  methods: {
    onCheck(obj, item) {
      item.value = obj.checked || [];
      this.$forceUpdate();
    },
    handleShow(row, permissionList) {
      this.visible = true;
      this.id = row.id;
      this.permissionList = [...permissionList];
      this.menuRoteIds = [...row.permissionNames];
      this.permissionList.forEach((item) => {
        item.value = [];
        if (this.menuRoteIds.includes(item.groupName)) {
          item.value.push(item.groupName);
        }
        if (item.permissions && item.permissions.length > 0) {
          item = this.filterMenuList(item.permissions, item);
        }
      });
      this.$nextTick(() => {
        document.getElementById('topId').scrollIntoView(true);
      });
    },
    filterMenuList(arr, item) {
      arr.forEach((child) => {
        if (this.menuRoteIds.includes(child.permissionName)) {
          item.value.push(child.permissionName);
        }
        if (child.children && child.children.length > 0) {
          child.disabled = true;
          child = this.filterMenuList(child.children, item);
        }
      });
      return item;
    },
    handleClose() {
      this.visible = false;
    },
    handleSubmit() {
      let arr = [];
      this.permissionList &&
        this.permissionList.forEach((item) => {
          arr = arr.concat(item.value);
        });
      let params = {
        permissionNames: arr || [],
      };
      this.loadLoading = true;
      putApiPermission(this.id, params)
        .then(() => {
          this.$message.success('保存成功');
          this.$emit('ok');
          this.handleClose();
        })
        .finally(() => {
          this.loadLoading = false;
        });
    },
  },
};
</script>
<style scoped>
/deep/.ant-modal-body {
  height: 500px;
  overflow-y: auto;
}
/deep/li.ant-tree-treenode-disabled
  > span.ant-tree-checkbox.ant-tree-checkbox-disabled {
  display: none !important;
}

/deep/
  .ant-tree
  li.ant-tree-treenode-disabled
  > .ant-tree-node-content-wrapper
  > span {
  color: rgba(0, 0, 0, 0.65) !important;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言—每日选择题—Day47

第一题 1. 以下逗号表达式的值为&#xff08;&#xff09; (x 4 * 5, x * 5), x 25 A&#xff1a;25 B&#xff1a;20 C&#xff1a;100 D&#xff1a;45 答案及解析 D 本题考查的就是逗号表达式&#xff0c;逗号表达式是依次计算每个表达式&#xff0c;但是只输出最后一个表…

DRF从入门到精通一(DRF介绍、API接口、接口测试工具)

文章目录 DRF入门规范一、Web应用模式1.前后端混合开发模式2.前后端分离开发模式 二、API接口概念Json格式与XML格式的区别前端、前台、后端以及后台的区别 三、接口测试工具&#xff1a;Postman/Apifox DRF入门规范 DRF(django rest framework)是基于django的一个框架&#xf…

文心一言 VS 讯飞星火 VS chatgpt (157)-- 算法导论12.3 4题

四、用go语言&#xff0c;删除操作可交换吗?可交换的含义是&#xff0c;先删除 x 再删除 y 留下的结果树与先除 y 再删除 x 留下的结果树完全一样。如果是&#xff0c;说明为什么? 否则&#xff0c;给出一个反例。 文心一言&#xff1a; 在Go语言中&#xff0c;删除操作是不…

企业信息建设现状

信息化建设是传统计算机与互联网技术高速发展并融合的产物&#xff0c;现阶段已经成为引领产业创新的决定性技术手段。 随着信息化的不断发展与进步&#xff0c;各行各业都开始了信息化的建设与应用。信息化是未来发展的大趋势&#xff0c;企业运用信息技术可以大幅度提高员工效…

知识|基于混合模式的多余度飞控全数字仿真系统研究

*余度&#xff08;Redundancy&#xff09;&#xff1a;一种确保安全的设计手段&#xff0c;使得出现两个及以上故障时&#xff0c;才会引起既定不希望发生的工作状态。 飞行控制软件主要完成飞行传感器数据处理、飞行姿态控制和余度管理任务&#xff0c;对保证飞机安全性和可靠…

leetCode算法—2.两数相加

1.给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0…

干货:企业如何讲好品牌故事

品牌故事讲得好&#xff0c;不仅能够体现品牌特色还能向消费者传递品牌精神的重要工具&#xff0c;优秀的品牌故事能够促进产品销量&#xff0c;为品牌带来曝光率&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;如何讲好品牌故事。 一、 品类历史和故事 品牌虽然是新品牌…

基于单片机智能家具无线遥控控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能家具无线遥控控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家具无线遥控控制系统设计可以实现对家具&#xff08;如灯具、窗帘、空调等&#xff09;的…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中&#xff0c;对于可变和不可变对象的行为差异是一个重要概念&#xff0c;特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先&#xff0c;让我们谈谈可变和不可…

JVM的内存分区以及垃圾收集

1.JVM的内存分区 1.1方法区 方法区(永久代&#xff09;主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 1.2虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的…

分析若依的文件上传处理逻辑

分析若依的文件上传处理逻辑 注&#xff1a;已经从若依框架完成拆分&#xff0c;此处单独分析一下人家精彩的封装&#xff0c;也来理解一下怎么做一个通用的上传接口&#xff01;如有分析的&#xff0c;理解的不透彻的地方&#xff0c;大家多多包含&#xff0c;欢迎批评指正&am…

【C语言必学知识点五】指针

指针 导言一、指针与指针变量二、指针变量的创建和指针类型三、指针类型的意义3.1 指针 /- 整数3.2 指针解引用 四、野指针4.1 定义4.2 野指针的成因4.3 指针未初始化4.4 指针越界访问4.5 指针指向的空间被释放4.6 如何规避野指针 五、指针运算5.1指针-整数5.2 指针-指针5.2.1 …

B037-Mybatis基础

目录 为什么需要Mybatis&#xff1f;mybatis简介入门案例其余见代码查询流程增删改流程 - 变动数据要加事务去持久化抽取公共类 mapper接口开发规则概述代码 mapper.xml引入本地约束文件别名日志管理作用log4j的使用规范 井大括号与dollar大括号的区别 框架&#xff1a;半成品&…

Linux篇:信号

一、信号的概念&#xff1a; ①进程必须识别能够处理信号&#xff0c;信号没有产生&#xff0c;也要具备处理信号的能力---信号的处理能力属于进程内置功能的一部分 ②进程即便是没有收到信号&#xff0c;也能知道哪些信号该怎么处理。 ③当进程真的受到了一个具体的信号的时候…

Word公式居中+序号右对齐

Word公式居中序号右对齐 # 号制表位法表格法Mathtype法 # 号 制表位法 表格法 Mathtype法 参考1 参考2

力扣每日一题:2132. 用邮票贴满网格图(2023-12-14)

力扣每日一题 题目&#xff1a;2132. 用邮票贴满网格图 日期&#xff1a;2023-12-14 用时&#xff1a;38 m 32 s 思路&#xff1a;使用前缀和&#xff0b;差分&#xff0c;只是往常是一维&#xff0c;现在变二维了&#xff0c;原理差不多 时间&#xff1a;22ms 内存&#xff1…

certum ev ssl证书1180元一年,360浏览器显示公司名

Certum旗下的EV SSL证书是审核最严的数字证书&#xff0c;不仅对网站传输数据进行加密&#xff0c;还可以对网站身份进行验证&#xff0c;除此之外&#xff0c;它独有的绿色地址栏提升了网站的真实性&#xff0c;增强了客户对网站的信任感。今天就随SSL盾小编了解Certum旗下的E…

【Spring Boot】视图渲染技术之Freemarker

一、引言 1、什么是Freemarker FreeMarker是一款模板引擎&#xff0c;基于模板和要改变的数据&#xff0c;并用来生成输出文本&#xff08;HTML网页、电子邮件、配置文件、源代码等&#xff09;的通用工具。它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c;是一款…

LAMP平台部署及应用

1、安装PHP软件包 1.1、准备工作 检查软件是否安装&#xff0c;避免冲突 [rootyang ~]# rpm -e php php-cli php-ldap php-common php-mysql --nodeps 错误&#xff1a;未安装软件包 php 错误&#xff1a;未安装软件包 php-cli 错误&#xff1a;未安装软件包 php-ldap 错误…

使用 Python 使用贝叶斯神经网络从理论到实践

一、说明 在本文中&#xff0c;我们了解了如何构建一个机器学习模型&#xff0c;该模型结合了神经网络的强大功能&#xff0c;并且仍然保持概率方法进行预测。为了做到这一点&#xff0c;我们可以构建所谓的贝叶斯神经网络。 这个想法不是优化神经网络的损失&#xff0…