【定制需求】el-tree 树形控件实现:每级可单独选择,选择父级不选中子集,子集全部选中不自动选中父级,手写按钮可支持子集全选,以及取消子集全选,el-tree 树形控件取消父子级联动选择

简介: 【定制需求】el-tree 树形控件实现:每级可单独选择,选择父级不选中子集,子集全部选中不自动选中父级,手写按钮可支持子集全选,以及取消子集全选,el-tree 树形控件取消父子级联动选择

背景:el-tree 树形控件实现:每级可单独选择,选择父级不选中子集,子集全部选中不自动选中父级,手写按钮可支持子集全选以及取消子集全选,el-tree 树形控件取消父子级联动选择,父级子集可随意选择


在网上找了很多资料也没有找到实现的效果,不知道是搜索的不对还是什么情况
以下是根据自己的思路手撸的一个效果

实现思路

使用el-tree实现树形结构效果,然后内嵌el-checkbox实现任意等级多选单选,在使用按钮操作实现子集全选反选

实现效果

image.png

el-tree 树形控件实现:每级可单独选择,选择父级不选中


代码

HTML代码

  <!-- 使用Element UI的el-tree组件展示树形结构数据,支持多选和操作子节点 -->
        <el-tree :data="treeData" node-key="id" :expand-on-click-node="false" highlight-current :props="treeProps">
            <!-- 自定义节点内容显示方式 -->
            <span class="custom-tree-node"  slot-scope="{ node, data }">
                <!-- 使用el-checkbox组件实现节点的多选功能 -->
                <el-checkbox :label="data.id" v-model="selectedIds" @change="handleCheckboxChange(data.id)">{{ node.label }}</el-checkbox>
                <!-- 当节点有子节点时,显示全选和取消全选按钮 -->
                <span v-if="hasChildren(data)">
                    <el-button type="text" size="mini" @click="selectAllChildren(data)">
                        全选子集
                    </el-button>
                    <el-button type="text" size="mini" @click="invertChildrenSelection(data)">
                        取消全选
                    </el-button>
                </span>
            </span>
        </el-tree>

js代码

<script>
export default {
    data() {
        return {
            // 树形结构的数据源
            treeData: [
                // 示例数据
            ],
            // 已选中节点的ID集合
            selectedIds: [],
            // 定义树形结构中子节点和标签的属性名
            treeProps: {
                children: 'children',
                label: 'name'
            },
        };
    },
    methods: {
        // 处理复选框选中状态变化的事件
        handleCheckboxChange(id) {
            // 根据需要实现checkbox变化逻辑
        },
        // 判断节点是否拥有子节点
        hasChildren(data) {
            return data.hasOwnProperty('children') && data.children.length > 0;
        },
        // 选中当前节点的所有子节点
        selectAllChildren(items) {
            const childIds = this.collectChildIdsRecursive(items.children);
            this.selectedIds = [...new Set([...this.selectedIds, ...childIds])];
        },
        // 取消选中当前节点的所有子节点
        invertChildrenSelection(items) {
            const childIds = this.collectChildIdsRecursive(items.children);
            this.selectedIds = this.selectedIds.filter(id => !childIds.includes(id));
        },
        // 递归收集节点及其子节点的ID
        collectChildIdsRecursive(items, result = []) {
            items.forEach(item => {
                result.push(item.id);
                if (item.children) this.collectChildIdsRecursive(item.children, result);
            });
            return result;
        },
    },
};
</script>

css代码

<style lang="scss" scoped>
.custom-tree-node {
    flex: 1;
    display: flex;
}
</style>

完整代码

<template>
    <div class="variable_all height100">
        <!-- 使用Element UI的el-tree组件展示树形结构数据,支持多选和操作子节点 -->
        <el-tree :data="treeData" node-key="id" :expand-on-click-node="false" highlight-current :props="treeProps">
            <!-- 自定义节点内容显示方式 -->
            <span class="custom-tree-node"  slot-scope="{ node, data }">
                <!-- 使用el-checkbox组件实现节点的多选功能 -->
                <el-checkbox :label="data.id" v-model="selectedIds" @change="handleCheckboxChange(data.id)">{{ node.label }}</el-checkbox>
                <!-- 当节点有子节点时,显示全选和取消全选按钮 -->
                <span v-if="hasChildren(data)">
                    <el-button type="text" size="mini" @click="selectAllChildren(data)">
                        全选子集
                    </el-button>
                    <el-button type="text" size="mini" @click="invertChildrenSelection(data)">
                        取消全选
                    </el-button>
                </span>
            </span>
        </el-tree>
    </div>
</template>

<script>
export default {
    data() {
        return {
            // 树形结构的数据源
            treeData: [
                // 示例数据
            ],
            // 已选中节点的ID集合
            selectedIds: [],
            // 定义树形结构中子节点和标签的属性名
            treeProps: {
                children: 'children',
                label: 'name'
            },
        };
    },
    methods: {
        // 处理复选框选中状态变化的事件
        handleCheckboxChange(id) {
            // 根据需要实现checkbox变化逻辑
        },
        // 判断节点是否拥有子节点
        hasChildren(data) {
            return data.hasOwnProperty('children') && data.children.length > 0;
        },
        // 选中当前节点的所有子节点
        selectAllChildren(items) {
            const childIds = this.collectChildIdsRecursive(items.children);
            this.selectedIds = [...new Set([...this.selectedIds, ...childIds])];
        },
        // 取消选中当前节点的所有子节点
        invertChildrenSelection(items) {
            const childIds = this.collectChildIdsRecursive(items.children);
            this.selectedIds = this.selectedIds.filter(id => !childIds.includes(id));
        },
        // 递归收集节点及其子节点的ID
        collectChildIdsRecursive(items, result = []) {
            items.forEach(item => {
                result.push(item.id);
                if (item.children) this.collectChildIdsRecursive(item.children, result);
            });
            return result;
        },
    },
};
</script>

<style lang="scss" scoped>
.custom-tree-node {
    flex: 1;
    display: flex;
}
</style>
目录
相关文章
|
8月前
|
JavaScript
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
157 0
el-table树形结构的复选-子级可选(整理)
el-table树形结构的复选-子级可选(整理)
el-table树形结构的复选-子级可选(整理)
|
10月前
【el-tree】树形结构拖拽,拖动修改分组
【el-tree】树形结构拖拽,拖动修改分组
343 1
element中el-cascader级联 下拉选择-可单独多选(整理)
element中el-cascader级联 下拉选择-可单独多选(整理)
|
2天前
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
12 3
|
4天前
|
定位技术 API 数据格式
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
7 0
|
2月前
|
JavaScript
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
|
8月前
easyui tree 默认选中第一个元素
easyui tree 默认选中第一个元素
|
8月前
|
JSON JavaScript 数据格式
Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
Elementui Tree 树形控件,将勾选选中的值放在list集合里面提交
51 1
|
2月前
el-cascader组件实现点击、递归勾选联动子集children所有选项被选中。
el-cascader组件实现点击、递归勾选联动子集children所有选项被选中。

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19