【定制需求】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-ui之el-tree树形控件勾选节点指定节点自动勾选(指定节点为必选项)
VUE element-ui之el-tree树形控件勾选节点指定节点自动勾选(指定节点为必选项)
2308 0
VUE element-ui之el-tree树形控件勾选节点指定节点自动勾选(指定节点为必选项)
|
JavaScript 数据安全/隐私保护
vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)
后台管理系统常见的权限控制需求,这里讲button实现交互细节处理, 取消选中子级menu/button,父级不关联取消; 选中/取消父级catalog/menu,子级全部选中/取消; 选中/取消部分子级menu/button,父级关联半选中状态(indeterminate=true);
1116 2
el-tree技巧之只能选中最后一层级的子节点以及查找树结构第一个无子节点的叶节点
el-tree技巧之只能选中最后一层级的子节点以及查找树结构第一个无子节点的叶节点
|
JSON 数据可视化 定位技术
Three.js实现3D地图可视化-省份
本项目实现了地图数据的可视化展示,支持下钻、缩放、旋转等多种交互功能。地图通过 shape 数据描绘,使用 D3 进行坐标转换与渲染,数据可从地图 JSON 工具获取。支持二次开发与离线部署,提供完整源码,欢迎联系获取。
1047 0
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
6773 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
|
移动开发 JavaScript HTML5
el-input限制输入整数等分析
本文介绍了在Vue中限制el-input只能输入整数的几种方式,包括设置type为number,使用inputmode属性,自定义指令,计算属性,使用onafterpaste和onkeyup事件以及使用el-input-number的precision属性。每种方式都有其优缺点,可以根据实际需求选择合适的方式。比较建议用自定义指令的方式来实现。
4083 0
el-input限制输入整数等分析
element中tree组件的选中获取和返显
本文介绍了如何在Element UI的tree组件中获取选中的节点值以及如何进行节点的默认选中(返显)。主要通过使用`getCheckedKeys()`和`getHalfCheckedKeys()`方法来获取完全和半选中的节点,然后使用`setCheckedKeys()`方法来设置默认选中的节点。
2149 2
element中tree组件的选中获取和返显
|
JavaScript
Vue3数字输入框(InputNumber)
这是一个可定制的数字输入框组件,支持设置宽度、最小值、最大值、步长、精度等属性,并可添加前缀图标及自定义显示格式。组件兼容键盘快捷键操作,具备禁用功能。示例代码展示了如何使用该组件实现不同场景下的数值输入与格式化展示。组件还利用 `add` 函数解决了 JS 精度问题,并通过 `useSlotsExist` 监听插槽。
1224 7
Vue3数字输入框(InputNumber)
el-input实现后缀图标和clearable的兼容,调整el-input clearable与自定义图标展示位置问题
el-input实现后缀图标和clearable的兼容,调整el-input clearable与自定义图标展示位置问题
1352 1
|
移动开发 前端开发
vue3 Element-Plus封装的el-tree-select的使用
vue3 Element-Plus封装的el-tree-select的使用
3770 0
vue3 Element-Plus封装的el-tree-select的使用