【定制需求】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>
目录
相关文章
|
JavaScript
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
359 0
【el-tree】树形结构拖拽,拖动修改分组
【el-tree】树形结构拖拽,拖动修改分组
586 1
|
1月前
element组件库笔记一:element 框架中table表格复选框选中后,切换下一页之前选中复选框和数据消失的问题
这篇文章介绍了在Element UI框架中,如何解决表格组件复选框在分页时选中状态丢失的问题。
35 0
|
4月前
|
JavaScript
【UI】 elementUI的select-tree组合下拉框,选择后下拉框不收起
【UI】 elementUI的select-tree组合下拉框,选择后下拉框不收起
247 1
|
4月前
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
Element UI【级联选择器】el-cascader 获取选中内容的 label 数据,鼠标悬浮显示超长内容
646 3
|
4月前
Element UI 多选表格--判断勾选数据行的 Checkbox 时为选中还是取消选中
Element UI 多选表格--判断勾选数据行的 Checkbox 时为选中还是取消选中
50 1
|
4月前
|
定位技术 API 数据格式
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
Element UI【详解】el-cascader 级联选择器 - 行政区划选择(可以选择任意一级),限定选择范围,获取并解析选中的节点
534 0
easyui tree 默认选中第一个元素
easyui tree 默认选中第一个元素
|
6月前
|
JavaScript
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题