a-tree 实现父级节点禁用,通过子级节点勾选状态控制

news2024/11/25 2:13:17

a-tree 组件实现折叠选择;使其父级节点禁用,通过子级节点的勾选状态来控制是否勾选;如果子级节点勾选任一个,父级节点就勾选中,如果子级节点全部不勾选则父节点不勾选,否则勾选 ,效果如下:

代码实现如下所示:

1、封装组件 setTableToolbar

vue 部分

<template>
    <div class="toolbar-meta">  
        <vxe-pulldown  ref="vxePulldown" transfer @hide-panel="hidePanel">
            <template #default>
                <a-button  shape="circle" @click="open()" :size="16">
                    <vxe-icon style="font-size: 20px;" name="setting"></vxe-icon> 
                </a-button>
            </template> 
            <template  #dropdown> 
                <div class="downBox" >
                    <!-- <div class="checkTopAll"> 
                        <a-checkbox 
                        v-model="checkAll"  
                        @change="onCheckAllChange"
                        >全部
                        </a-checkbox>
                    </div> -->
                    <div class="checkItem"> 
                        <a-tree  
                            v-if="plainOptions.length>0"
                            checkable
                            :checkStrictly="true"
                            :tree-data="plainOptions"  
                            :expandedKeys="expandedKeys"
                            :checkedKeys="checkedList"
                            :replace-fields="{children: 'children', title: 'title', key: 'id'}"
                            @expand="onExpand" 
                            @check="checkNode"
                        />
                    </div>
                     <!-- 底部按钮 -->
                     <div  class="downBtn clearfix">
                        <a-button class="btnOk" @click="sumbitOk">确认</a-button>
                        <a-button class="btnReset" @click="sumbitReset">全选</a-button>
                     </div>
                </div> 
            </template>
        </vxe-pulldown> 
    </div>
</template>

 js部分代码设置:

export default {
    name: 'setTableToolbar',
    components: { 
    },
    props: { 
        columns: {
            type: Array, 
            default: [],
        }
    },
    data(){
        return { 
            expandParent: true,
            expandedKeys: [],
            indeterminate: true,
            userInfo: {},
            checkAll: false,
            checkedList: [],
            plainOptions: [],
            Downtype: false
        }
    }, 
    watch: {
        checkedList() { // 监听设置
            this.isCheckedAll()
        },
    },
    methods:{
        open(){
            this.$refs.vxePulldown.togglePanel() 
            if(this.Downtype){
                this.sumbitOk()
                // this.$refs.vxePulldown.hidePanel() 
            } else {
                this.Downtype = !this.Downtype
            } 
        },
        // 隐藏 执行保存
        hidePanel(){
            this.sumbitOk()
        },
        // 父级节点展开、收缩事件
        onExpand(select, e){
            let val = e.node.eventKey || '' 
            if(this.expandedKeys.indexOf(val) > -1) { 
                this.expandedKeys.splice(this.expandedKeys.indexOf(val), 1) 
            } else {
                this.expandedKeys.push(val) 
            } 
        }, 
        // 
        /**
         * 初始设置
         * @param {*} arr  所有选择项
         * @param {*} selearr  已选择项
         * @param {*} info  用户信息 保存使用
         */
        resetListLable(arr, selearr, info){
            this.userInfo = info || {}
            let plainOptions = []
            arr.forEach((item, i) => {
                if(item.title&&item.dataIndex&&item.dataIndex != 'action'){
                    item.id = item.dataIndex 
                    item.key = '0-'+i
                    if(item.children && item.children.length>0){
                        item.disabled = true
                        item.children.forEach((itm,u)=>{
                            itm.id = itm.dataIndex ? itm.dataIndex : 'p-'+i +'-'+u
                            itm.key = '0-'+i +'-'+u
                            if(itm.children&&itm.children.length>0){
                                itm.disabled = true
                                itm.children.forEach((imt,ui)=>{
                                    imt.id= imt.dataIndex ? imt.dataIndex : 'p-'+i +'-'+u+'-'+ui
                                    imt.key = '0-'+i +'-'+u+'-'+ui
                                })
                            }
                        })
                    } 
                    plainOptions.push(item) 
                } 
            });
            this.plainOptions = plainOptions 
            let seletOption = [] 
            if(selearr){
                selearr.forEach(itm => {
                    if(itm.title&&itm.dataIndex&&itm.dataIndex != 'action'){  
                        let objItem = itm.dataIndex
                        seletOption.push(objItem)
                        if(itm.children&&itm.children.length>0){
                            itm.children.forEach(itm2=>{
                                seletOption.push(itm2.dataIndex)
                                if(itm2.children&&itm2.children.length>0){
                                    itm2.children.forEach(itm3=>{
                                        seletOption.push(itm3.dataIndex) 
                                    })
                                }
                            })
                        }
                    } 
                }); 
            }
           this.checkedList = seletOption
        },
        //选择点击 
        checkNode(check, e){
            this.checkedList =  e.checkedNodes &&  e.checkedNodes.length>0 ? e.checkedNodes.map(x=>{return x.key}) : []  
           this.parentCheckNode(check, e)
        },
        // 判断是否选择父节点
        parentCheckNode(check, e){ 
           this.plainOptions.forEach((item,u)=>{
                if(this.checkedList.indexOf(item.id) > -1) {
                    let isHaveParent = true
                    // 查子节点内是否
                    if(e.checked == false && item.children && item.children.length>0){ 
                        item.children.forEach((itm,b)=>{
                            if(this.checkedList.indexOf(itm.id) > -1) { 
                                let isPHaveParent = true
                                if(e.checked == false && itm.children && itm.children.length>0){
                                    itm.children.forEach(itm2=>{
                                        if(this.checkedList.indexOf(itm2.id) > -1) {
                                            isPHaveParent = false
                                            return
                                        }
                                    })
                                    if(isPHaveParent == true){
                                        this.checkedList.splice(this.checkedList.indexOf(itm.id), 1)  
                                        return
                                    } 
                                } else {
                                    isHaveParent = false 
                                    return
                                } 
                            }  
                        })
                        if(isHaveParent == true){
                            this.checkedList.splice(this.checkedList.indexOf(item.id), 1)  
                            return
                        }
                    } else {
                        return
                    } 
                    return
                } else { 
                   if(item.children && item.children.length>0){
                        item.children.forEach((itm,b)=>{
                            if(this.checkedList.indexOf(itm.id) > -1) { 
                                this.checkedList.push(item.id)
                                return
                            } else { 
                                if(itm.children&&itm.children.length>0){
                                    itm.children.forEach((imt,ui)=>{
                                        if(this.checkedList.indexOf(imt.id) > -1) { 
                                            this.checkedList.push(item.id)
                                            this.checkedList.push(imt.id)
                                            return
                                        }   
                                    })
                                }
                            }
                          
                        })
                    }
                } 
           })
        },
         // 查看点击事件
        selectNode(selectkey, e){  
            let node_eventKey = e.node.eventKey || ''  
            this.param = { 
                id: node_eventKey,
                title: e.node.title || '',
            }
            this.selectKeys = [node_eventKey]  
        }, 
        // 全选设置
        onCheckAllChange(e){ 
            let newList = []
            if(e.target.checked){
                this.plainOptions.forEach(item =>{
                    newList.push(item.dataIndex)
                })
            } 
            this.checkedList = newList  
            this.isCheckedAll()
        },
        // 判断是否全选
        isCheckedAll(){
            let isAll = false
            isAll = this.checkedList.length == this.plainOptions.length ? true : false
            this.indeterminate = isAll
            this.checkAll = isAll
        },
        // 确认选中
        sumbitOk(){
            let extend = this.checkedList.join(',') 
            this.$emit('isSettingColumnsOk', this.checkedList)
            this.$refs.vxePulldown.hidePanel() 
            this.Downtype = false
        },
        // 还原全选
        sumbitReset(){
            this.checkAll = true
            let newList = []
            this.plainOptions.forEach(item =>{
                newList.push(item.dataIndex)
                if(item.children && item.children.length>0){
                    item.children.forEach((itm,u)=>{
                        newList.push(itm.dataIndex)
                        if(itm.children&&itm.children.length>0){
                            itm.children.forEach((imt,ui)=>{
                                newList.push(imt.dataIndex)
                            })
                        }
                    })
                }
            })
            this.checkedList = newList
            let extend = this.checkedList.join(',')
            this.$nextTick(() => { 
                this.$emit('isSettingColumnsOk', this.checkedList)
                this.$refs.vxePulldown.hidePanel() 
                this.Downtype = false
            })
        }, 
    }
}

style 样式部分修改;

.toolbar-meta{
    position: relative; 
}
.downBox{
        width: 220px;
        position: relative;
        overflow: hidden;
        border: 1px solid #999;
        border-radius: 4px;
        .checkTopAll{
            position: absolute; 
            top: 0;
            left: 0;
            border-bottom: 1px solid #999;
            padding: 10px 5px;
            width:100%;
            background-color: #fff; 
            z-index: 999;
        }
        .checkItem{
            position: relative;
            width: 220px; 
            max-height:200px; 
            overflow:auto; 
            padding: 10px;
            margin-bottom: 40px;
            .checkLi{
                display: block;
                width: 100%;
            }
            .ant-checkbox-group-item{
                display: block;
            }
        }
        .downBtn{
            position: absolute;
            z-index: 999;
            bottom: 0;
            left: 0;
            width: 100%;
            padding: 5px 10px; 
            background: #fff;
            border-top:1px solid #999;
            .btnReset{
                float: right;
            }
        }
    }

2、引用组件:setTableToolbar

<set-table-toolbar ref="setTableToolbar1" :columns="defColumns" @isSettingColumnsOk="isSettingColumnsOk" @reshload="reshColumns"></set-table-toolbar>

<script>
// 列配置
import setTableToolbar from "./common/setTableToolbar.vue"
export default {
    components: {
        setTableToolbar 
    },
    data() {
        return {
            tableColumnsParams:{},
            settingColumns: [],
            defColumns: []
        }
    },
    methods:{
        // 配置列点击确认
     isSettingColumnsOk(settingColumnsStr){ 
       if (settingColumnsStr&&settingColumnsStr.length>0) {
        this.settingColumns = settingColumnsStr
        let params = {
          'id': this.tableColumnsParams.id || '',
          'tableId': this.tableColumnsParams.cgformHeadId || this.code,
          'conntent': settingColumnsStr.join(',')
        }
       Vue.ls.set('保存缓存名字', settingColumnsStr.join(','))
        // this.saveColumnsHiding(params)
      } 
    },
    // 配置列后获取
    reshColumns(){  
        this.$nextTick(() => { 
            this.loadData(1)
        })
    },
    }
}
</script>

补充,其他设置:初始执行设置被选项,已选项等;

 this.$refs.setTableToolbar.resetListLable(this.defColumns, cols, info)

以上内容仅供参考,具体请根据实际情况选用;

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

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

相关文章

Vue中TodoList案例_总结

完整项目&#xff1a; App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"addTodo"/><MyList :todos"todos" :checkTodo"che…

LeetCode226. 翻转二叉树

226. 翻转二叉树 文章目录 [226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)一、题目二、题解方法一&#xff1a;层序遍历迭代方法二&#xff1a;前序遍历(递归)方法三&#xff1a;中序遍历&#xff08;递归&#xff09;方法四&#xff1a;后序遍历&#…

c++ visual studio opencv配置

项目属性表配置方式&#xff1a; 1、新建项目后&#xff0c;在属性管理器中&#xff0c;创建一个项目属性表&#xff1a; 注&#xff1a;根据需求创建。 2、双击项目属性表 依次修改包含目录、库目录、附加包含目录、附加依赖项。 2.1【包含目录】中加入 OpenCV 的 include …

为harbor仓库添加https,新增DigiCert 免费版SSL证书

完成效果&#xff1a; 前言&#xff1a;在本地搭建好docker的镜像仓库harbor后&#xff0c;当我们登录docker login时&#xff0c;会提示证书问题x509: cannot validate certificate 登录本地报错X509 无法登录仓库也无法上传和拉取镜像&#xff0c;虽然有本机的解决方法&…

android studio 新建项目没有R文件

android studio 新建项目没有R文件&#xff0c;处理步骤 1&#xff0c;找一个能打开的项目替换根目录下的settings.gradle 2,改app 目录下的build.gradle文件 3&#xff0c;改gradle版本 4&#xff0c;改AndroidManifest.xml 5&#xff0c;改theme 改为&#xff0c;ok.

gtest测试用例注册及自动化调度机制源代码流程分析

gtest的入门参见&#xff1a; 玩转Google开源C单元测试框架Google Test系列(gtest) gtest源码分析流程参见&#xff1a; gtest流程解析 测试用例注册流程分析要点&#xff1a;TEST_F宏替换、C静态成员的动态初始化。 自动化调度流程分析要点&#xff1a;UnitTest、UnitTestIm…

CRM系统的排名?都有哪些特点?

在当今商业世界中&#xff0c;CRM客户管理系统是每一家企业所必不可少的工具。它们能够帮助企业管理客户信息&#xff0c;跟进销售机会以及提高客户体验。众多的CRM中&#xff0c;哪个CRM性价比高&#xff0c;企业该如何选择&#xff1f; 在比较CRM软件时&#xff0c;除基本功…

90道渗透测试面试题(附答案)

2023年已经快过去一半了&#xff0c;不知道小伙伴们有没有找到自己心仪的工作呀。最近后台收到不少小伙伴说要我整理一些渗透测试的面试题&#xff0c;今天它来了&#xff01;觉得对你有帮助的话记得点个赞再走哦~ 1、什么是渗透测试&#xff1f; 渗透测试是一种评估计算机系统…

HCIA练习2

目录 第一步 启动eNSP&#xff0c;搭建如图所示的拓扑结构 第二步 进行子网的划分 ​第三步 从第二步划分的16个网段中&#xff0c;选择14个网段进行使用 第四步 对路由器各个端口进行IP配置 第五步 对每个路由器的环回接口进行配置 第六步 对路由器进行静态路由配…

QT designer的安装+PyUIC 和 PyRCC

PyQt5的安装 整个环境的搭建&#xff0c;主要内容为&#xff1a;Python PyCharm PyQt5 学习pyqt5制作界面的视频推荐网址&#xff1a; https://www.bilibili.com/video/BV1YT4y1r7tK?spm_id_from333.999.0.0&vd_sourceda469f8dadbc58a00f885b3f7be5ef05 配置工具&…

java项目之文物管理系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的文物管理系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

Linux系统上安装 Redis 5.0 版本

文章目录 一、安装 gcc二、Redis官网下载安装包三、xftp上传安装包四、解压安装包五、编译与安装&#xff08;make&#xff09;六、后台启动七、查看rdis进程八、客户端连接 一、安装 gcc 安装gcc的主要作用是提供编译器和工具链&#xff0c;因为redis是c语言编写的&#xff0…

基于Vue+Element Plus实现表格组件

目录 前言分析实现例子效果图前言 表格对于管理类项目是很重要的,可以只管的展示和比比较数据。使用Element Plus能解决一部分问题,但是还存在一些缺点和不足。 分析 浏览器上表格数据展示空间不足。列显示太多不够直观。完全依赖官方表格组件代码过于臃肿不利于管理和优化…

mybatis 基础3

1.collection标签 查询-场景&#xff1a;一对多 2.动态查询 3.动态添加 4.动态修改 5. 批量添加 foreach标签中属性的用法 6.查询-参数为List 7.查询-参数为Map

【后端面经】前言汇总(0)

文章目录 一、机会是留给有准备的人二、课程设计第一部分:微服务架构第二部分:数据库与 MySQL第三部分:消息队列第四部分:缓存所谓缓存用得好,性能没烦恼。第五部分:NoSQL三、总结一、机会是留给有准备的人 近两年互联网行业增速放缓,ChatGPT 又引发了一波新的 AI 浪潮,…

“百模大战”打响,如何评估一个AI大模型的能力水平?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 大型AI模型已经变得越来越常见&#xff0c;它们在许多复杂任务中展现出了强大的实力&#xff0c;引领着前沿技术的发展趋势。这些大模型既给了我们无限的可能&#xff0c;也带来了一个难题&#xff1a;在“百模大战”的大背…

【Flume 01】Flume简介、部署、组件

1 Flume简介 Flume是一个高可用、高可靠、分布式的海量日志采集、聚合和传输的系统 主要特性&#xff1a; 它有一个简单、灵活的基于流的数据流结构&#xff08;使用Event封装&#xff09;具有负载均衡机制和故障转移机制一个简单可扩展的数据模型(Source、Channel、Sink) Sou…

C# List 详解一

目录 一、概述 二、构造函数 1.List() 2.List(IEnumerable) 3.List(Int32) 三、属性 1.Capacity 2.Count 3.Item[Int32] 四、方法 1.Add(T) 2.AddRange(IEnumerable) 3.AsReadOnly() 4.BinarySearch(T) C# List 详解一 1.Add…

vue3+antd搭建登录页面——vue3初体验——基础积累

最近在跟着大神学习vue3&#xff0c;学习过程中遇到各种问题&#xff0c;简直跟几年前学习vue2时一样的不知所措。 认识vite_vue3 初始化项目到打包&#xff1a;http://t.csdn.cn/B3bwC 为了方便&#xff0c;我是直接在stepin-template项目的基础上操作的&#xff0c;省略了上…

Unity VisualScripting(Bolt)自定义Node(带详细注释)

效果&#xff1a;获取一个物体的全部子物体和孙物体等从属物体 //引用一些东西&#xff0c;这样才能用某些API using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;//类名和Node名一样 public class GetTreeChildr…