ElementUi tree树叶子节点显示复选框且限制勾选

ElementUi tree树叶子节点显示复选框且限制勾选个数



前言

业务需求:

  • 只有子节点有复选框
  • tree树最多选 5个,其余的显示为禁用状态

一、子节点展示复选框

如图所示:

在这里插入图片描述
查看解析后的树结构代码我们知道,只有叶子节点有单独的class标识is-leaf,如果是单独操作叶子节点则可以从这个标识下手;

隐藏根节点,展示叶子节点

<style scoped lang="scss">
    ::v-deep .el-tree {
        padding-top: 15px;
        padding-left: 10px;

    /*不可全选样式*/
    .el-tree-node {
        .is-leaf + .el-checkbox .el-checkbox__inner {
            display: inline-block;
        }

        .el-checkbox .el-checkbox__inner {
            display: none;
        }
      }
    }
</style>

二、限制勾选个数

<template>
    <el-tree
        :data="treeList"
        ref="tree"
        show-checkbox
        node-key="id"
        :props="defaultProps"
        @check="onTreeCheck"
    >
    </el-tree>
</template>

1.tree树叶子节可勾选

  • 使用递归处理tree树数据

代码如下(示例):

 handleTreeData(tree, arr = []) {
    if (!tree.length) return [];
    for (let item of tree) {
        let node = {...item, children: []};
        if (item.children && item.children.length) {
           node.disabled = true;
        }
        arr.push(node)
        if (item.children && item.children.length) 
        this.handleTreeData(item.children, node.children)
    }
    return arr;
}
  • 获取当前选中节点信息
    使用 treecheck 方法, 接受两个参数:
    • 传递给 data 属性的数组中该节点所对应的对象
    • 树目前的选中状态对象,包含 个属性:
      • checkedNodes: 目前被选中的节点所组成的数组
      • checkedKeys: 目前被选中的节点key 所组成的数组
      • halfCheckedNodes: 目前半选中的节点所组成的数组
      • halfCheckedKeys : 目前半选中的节点key 的数组

2.更新复选框状态

代码如下(示例):

updateTreeStatus(checkedKeys, status = false) {
    const treeRef = this.$refs.tree;
    if (treeRef) {
    	// tree 仓库
        const treeStore = treeRef.store || {};
        // tree node集合
        const treeNodesMap = treeStore.nodesMap || {};
        Object.keys(treeNodesMap).forEach(key => {
            const item = treeNodesMap[key] || {};
            // 是否是叶子节点
            if (item.isLeaf) {
            	// 更新选中节点之外的复选框状态
                if (!checkedKeys.includes(key)) {
                    let data = item.data || {};
                    data.disabled = status;
                    treeRef.setCurrentNode(data);
                }
            }
        })
    }
}

完整代码

<template>
    <el-tree
        :data="treeList"
        ref="tree"
        show-checkbox
        node-key="id"
        :props="defaultProps"
        @check="onTreeCheck"
    >
    </el-tree>
</template>

<script>
    export default {
        data() {
            return {
                list: [
                    {
                        id: 1,
                        label: '一级 1',
                        children: [{
                            id: 4,
                            label: '二级 1-1',
                            children: [{
                                id: 9,
                                label: '三级 1-1-1'
                            }, {
                                id: 10,
                                label: '三级 1-1-2'
                            }]
                        }]
                    }, {
                        id: 2,
                        label: '一级 2',
                        children: [{
                            id: 5,
                            label: '二级 2-1'
                        }, {
                            id: 6,
                            label: '二级 2-2'
                        }]
                    }, {
                        id: 3,
                        label: '一级 3',
                        children: [{
                            id: 7,
                            label: '二级 3-1'
                        }, {
                            id: 8,
                            label: '二级 3-2'
                        }]
                    }],
                defaultProps: {
                    children: 'children',
                    label: 'label'
                },
                treeList: []
            };
        },
        mounted(): void {
            this.treeList = this.handleTreeData(this.list);
        },
        methods: {
            handleTreeData(tree, arr = []) {
                if (!tree.length) return [];
                for (let item of tree) {
                    let node = {...item, children: []};
                    if (item.children && item.children.length) {
                        node.disabled = true;
                    }
                    arr.push(node)
                    if (item.children && item.children.length) this.handleTreeData(item.children, node.children)
                }
                return arr;
            },
            onTreeCheck(data, treeInfo) {
                const checkedKeys = treeInfo.checkedKeys || [];
                const isDisabledOtherNode = checkedKeys.length >= 5;
                this.updateTreeStatus(checkedKeys, isDisabledOtherNode);
            },
            updateTreeStatus(checkedKeys, status = false) {
                const treeRef = this.$refs.tree;
                if (treeRef) {
                    const treeStore = treeRef.store || {};
                    const treeNodesMap = treeStore.nodesMap || {};
                    Object.keys(treeNodesMap).forEach(key => {
                        const item = treeNodesMap[key] || {};
                        if (item.isLeaf) {
                            if (!checkedKeys.includes(key)) {
                                let data = item.data || {};
                                data.disabled = status;
                                treeRef.setCurrentNode(data);
                            }
                        }
                    })
                }
            }


        }
    };
</script>

<style scoped lang="scss">
    ::v-deep .el-tree {
        padding-top: 15px;
        padding-left: 10px;

    /*不可全选样式*/
    .el-tree-node {
        .is-leaf + .el-checkbox .el-checkbox__inner {
            display: inline-block;
        }
    
        .el-checkbox .el-checkbox__inner {
            display: none;
        }
      } 
    }
</style>
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
jQuery攻略目录 图书信息 内容简介 作者简介 图书目录 编辑本段图书信息    书 名: jQuery攻略   作 者:哈瓦尼(B.M.Harwani)   出版社: 人民邮电出版社   出版时间: 2010年10月1日   ISBN: 9787115238306   开本: 16开   定价: 59.00元 编辑本段内容简介   《jQuery攻略》对使用jQuery过程中遇到的各类问题给出了解决方案,比如,如何使用jQuery框架、CSS选择器、DOM、事件处理、动画效果,以及如何开发Ajax应用程序、如何使用jQuery工具函数、如何使用插件扩展jQuery。   《jQuery攻略》非常适合想利用最少的代码创建交互性网站的开发人员学习和参考,也适合懂少量HTML知识又想创建动态网站的初学者学习。 编辑本段作者简介   作者:(印度)哈瓦尼(B.M.Harwani) 译者:侯伯薇 陈宁   B.M.Harwani,印度阿杰梅尔的微芯计算机教育中心(MCE)总经理。他毕业于Pane大学的计算机工程系获得学士学位,拥有印度政府机构DOEACC颁发的C级证书(计算机硕士文凭)。在教学领域工作的15年多来,他开发出了富有艺术性的教学方法,以人人都能懂的方式去解释哪怕最复杂的课题。 编辑本段图书目录   第1章 jQuery基础知识 1   1.1 jQuery的安装 1   1.2 选择DOM节点 2   1.3 延迟JavaScript的执行 3   1.4 把CSS应用到元素上 3   1.5 选择一系列非标准的HTML元素 4   1.6 计数DOM节点和显示其文本 5   1.7 获得一个元素的HTML代码 7   1.8 改变DOM节点的内容 8   1.9 快速创建DOM节点 9   1.10 为不同HTML元素分配相同类名并对它们应用样式 12   1.11 小结 13   第2章 数组和字符串 14   2.1 利用数组在列表中显示名字 14   2.2 操作数组元素 17   2.3 筛选数组元素,只显示所需的数据 19   2.4 字符串数组和数值数组的排序 22   2.5 拆分数组 24   2.6 合并数组 26   2.7 把数值数组转换成字符串,并查找其子字符串 27   2.8 创建对象数组 28   2.9 为对象数组排序 30   2.10 小结 32   第3章 事件处理 33   3.1 查找被点击的按钮 34   3.2 自动触发事件 37   3.3 点击之后禁用按钮 39   3.4 处理鼠标事件 40   3.5 查明哪个鼠标键被按下 43   3.6 查找鼠标按下时的屏幕坐标 44   3.7 动态地突出显示文本 45   3.8 随着鼠标移动使图像明亮或模糊 47   3.9 查明元素何时获得和失去焦点 49   3.10 在按钮上应用悬停效果 50   3.11 切换应用一个CSS类 52   3.12 创建基于图像的变换 54   3.13 为响应事件而添加和删除文本 57   3.14 应用样式作为对事件的响应 58   3.15 显示文字气球 60   3.16 创建“返回顶部”链接 63   3.17 提供“更多&hellip;&hellip;”链接 64   3.18 以动画效果显示文本 67   3.19 以滑动效果来替换文本 70   3.20 使图像滚动 71   3.21 确定被按下的键 75   3.22 防止事件冒泡 77   3.23 链接多个活动 80   3.24 小结 81   第4章 表单验证 82   4.1 确认必需字段不留空 82   4.2 验证数字字段 84   4.3 验证电话号码 88   4.4 验证用户ID 90   4.5 验证日期 92   4.6 验证电子邮件地址 94   4.7 检查复选框是否被选中 96   4.8 检查单选按钮是否被选中 99   4.9 检查select元素中的选项是否被选中 101   4.10 把样式应用到选项和表格按钮 104   4.11 一步选择或取消所有的复选框 107   4.12 验证两个字段 110   4.13 验证密码和确认密码字段是否匹配 113   4.14 禁用某些字段 116   4.15 验证整个表单 118   4.16 表单数据序列化 128   4.17 小结 132   第5章 页面导航 133   5.1 编写面包屑菜单 133   5.2 把悬停效果添加到菜单项 135   5.3 创建上下文菜单 137   5.4 创建具有快捷键的导航菜单 140   5.5 创建一个右键单击上下文菜单 144   5.6 创建具有独立菜单项的两个菜单 147   5.7 建立包含子菜单项的两个菜单 149   5.8 创建折叠式菜单 153   5.9 创建动态可视化菜单 156   5.10 小结 161   第6章 视觉特效 162   6.1 水平和垂直显示图片 162   6.2 创建水平滑动的图片浏览器 165   6.3 显示一幅图片,点击时向左滚动并消失 166   6.4 创建图片,使它向左滚动消失,然后从右侧重新出现 169   6.5 使图片在浏览器窗口中间滚动 171   6.6 在鼠标悬停时依次显示图片 172   6.7 垂直滚动图片 175   6.8 水平滚动图片 179   6.9 创建新闻滚动浏览器 183   6.10 在鼠标悬停时显示放大的图片 188   6.11 按页显示图片 193   6.12 在任意两个方向上切换图片 196   6.13 编写钟摆式滚动器 199   6.14 使用数组来滚动图片 202   6.15 小结 205   第7章 处理表格 206   7.1 在鼠标悬停时突出显示行 206   7.2 交替突出显示相邻列 207   7.3 过滤行 211   7.4 隐藏选定列 213   7.5 分页显示表格 215   7.6 展开和折叠列表项 218   7.7 展开和折叠行 221   7.8 对列表项目排序 226   7.9 对表格排序 227   7.10 过滤表格中的行 233   7.11 小结 235   第8章 Ajax 237   8.1 显示欢迎信息 237   8.2 执行认证 241   8.3 验证用户名 243   8.4 验证邮件地址 246   8.5 使用自动完成 252   8.6 导入HTML 256   8.7 取得JSON数据 259   8.8 取得XML数据 261   8.9 分页显示表格 265   8.10 小结 268   第9章 使用插件 269   9.1 对表格的任一列进行过滤,并且可以设置每页的行数 269   9.2 为图片添加注解 271   9.3 拖放表格中的行 273   9.4 取得、序列化并清理表单控件 275   9.5 通过Ajax提交表单 277   9.6 找到元素的准确位置和大小 281   9.7 以传送带的方式显示图片 284   9.8 使用datepicker选择日期 286   9.9 对表格排序 288   9.10 小结 289   第10章 使用CSS 290   10.1 区分HTML元素 291   10.2 向内嵌在一个元素中的另一个元素应用样式 292   10.3 缩进段落 293   10.4 将段落的首字母设为大写 294   10.5 去除标题和段落之间的间隔 295   10.6 向标题文字应用样式 297   10.7 缩进多个段落的第一行 297   10.8 创建带有悬挂缩进的段落 298   10.9 创建带有边框的提取引用 299   10.10 创建带有图片的提取引用 301   10.11 向列表项应用列表属性 302   10.12 只对选定的列表项应用样式 303   10.13 在列表项之间放置分隔线 306   10.14 向列表应用图片标记 307   10.15 创建水平显示的列表 308   10.16 在超链接上应用样式 309   10.17 为HTML元素赋予不同的尺寸 311   10.18 放置HTML元素 313   10.19 创建多栏的布局 314   10.20 使文字围绕图片显示 316   10.21 在图片背后放置阴影 317   10.22 当鼠标移过链接的时候改变鼠标样式 319   10.23 在指定的区域中显示长文字 320   10.24 创建圆角的栏 322   10.25 应用文字装饰 323   10.26 缩放图片 324   10.27 设置背景图片 326   10.28 使背景图片在浏览器中央显示 327   10.29 保持背景图片固定 328   10.30 小结 330
控制 Vue ElementUI Tree 形控件中选中节点的状态,可以使用 `default-checked-keys` 或 `default-expanded-keys` 属性来设置默认选中和展开的节点。如果需要动态控制选中节点,可以使用 `v-model` 绑定一个数组,数组中存储选中节点的 key 值。 具体来说,可以按照以下步骤进行: 1. 在组件中定义一个数组,用于存储选中节点的 key 值,例如: ``` data() { return { checkedKeys: [] }; }, ``` 2. 在 Tree 组件上使用 `v-model` 将选中的节点 key 值与上面定义的数组进行双向绑定,例如: ``` <el-tree v-model="checkedKeys" :data="data" show-checkbox :default-checked-keys="['1001']" :default-expanded-keys="['1']" node-key="id" :props="defaultProps" ></el-tree> ``` 其中,`checkedKeys` 即为上文中定义的数组,`data` 为 Tree 组件的数据源,`show-checkbox` 表示显示复选框,`default-checked-keys` 和 `default-expanded-keys` 分别用来设置默认选中和展开的节点,`node-key` 表示节点的唯一标识,`defaultProps` 用来配置节点的属性。 3. 在需要控制选中状态的地方,修改 `checkedKeys` 数组即可。例如,可以在 Tree 组件的 `node-click` 事件中进行修改,例如: ``` <el-tree ... @node-click="handleNodeClick" ></el-tree> ``` ``` methods: { handleNodeClick(data, node) { if (this.checkedKeys.includes(data.id)) { this.checkedKeys.splice(this.checkedKeys.indexOf(data.id), 1); } else { this.checkedKeys.push(data.id); } } } ``` 在上面的例子中,`handleNodeClick` 方法会在节点被点击时触发,如果当前节点的 key 值已经存在于 `checkedKeys` 数组中,则从数组中删除该值,否则将该值添加到数组中。这样就可以动态控制选中节点的状态了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑看、人世间@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值