vue结合element UI做checkbox全选的tree结构
由于element UI中的tree可能不能满足项目中的样式需求,所以自己动手结合element中的checkbox全选功能实现了一个符合项目需求的tree。效果如下:

html部分:
<template>
<div class="tree-container">
<div v-for="(item,index) in menus" :key="index">
<p class="toggleIcon" @click="toggleShow(item)">{{item.isShowAll?'-':'+'}}</p>
<el-checkbox :indeterminate="item.isIndeterminate" v-model="item.checkAll" @change="((val)=>{handleCheckAllChange(item,val)})">
{{item.name}}
</el-checkbox>
<span class="checkBox-num">{{item.num}}</span>
<el-checkbox-group v-model="item.checkedCities" @change="((val)=>{handleCheckedCitiesChange(item,val)})" class="checkGroup" v-if="item.isShowAll">
<el-checkbox v-for="(it,i) in item.userList" :key="i" :label="it.num" @change="((val)=>{handleCheckedOne(it,val)})">
<label class="icon-zhu" v-if="it.telType == '移动电话' && numList.indexOf(it.num)>=0 ">
<span :class="numList[0] === it.num?'colorful-icon':''">主</span>
</label>
<label class="tree-text">
{{it.telType}}
<span v-if="it.cardType">({{it.cardType}})</span>
</label>
<label class="tree-text">{{it.num}}</label>
<label class="tree-text">{{it.label}}</label>
</el-checkbox>
</el-checkbox-group>
</div>
</div>
</template>
js部分:
export default {
    name: "Tree",
    props: ["menus", "formData", "numList"],
    methods: {
        // 是否展开checkbox
        toggleShow(item) {
            item.isShowAll = !item.isShowAll;
        }, handleCheckAllChange(item, val) {
            if (val) {
                item.userList.map(it = > {
                    let numIndex = this.numList.indexOf(it.num);
                    item.checkedCities.push(it.num);
                    this.formData.userNum = Array.from(new Set(this.formData.userNum.concat(item.checkedCities)));
                    if (it.telType == "移动电话") {
                        this.numList.push(it.num);
                    }
                });
            } else {
                item.userList.map(it = > {
                    let Index = this.formData.userNum.indexOf(it.num);
                    let numIndex = this.numList.indexOf(it.num);
                    if (Index > -1) {
                        this.formData.userNum.splice(Index, 1);
                    }
                    if (numIndex > -1) {
                        this.numList.splice(numIndex, 1);
                    }
                });
                item.checkedCities = [];
            }
            item.isIndeterminate = false;
        }, handleCheckedCitiesChange(item, val) {
            let checkedCount = val.length;
            item.checkAll = checkedCount === item.userList.length;
            item.isIndeterminate = checkedCount > 0 && checkedCount < item.userList.length;
        }, handleCheckedOne(item, val) {
            let Index = this.formData.userNum.indexOf(item.num);
            let numIndex = this.numList.indexOf(item.num);
            //如果找到了,有此值
            if (Index > -1) {
                this.formData.userNum.splice(Index, 1);
            } else {
                this.formData.userNum.push(item.num);
            }
            if (item.telType == "移动电话") {
                if (numIndex > -1) {
                    this.numList.splice(numIndex, 1);
                } else {
                    this.numList.push(item.num);
                }
            }
        }
    }
};
css样式
<style lang="scss" scoped> @import "../../../assets/css/base.scss";
.tree-container {
width: 100%;
position: relative;
padding: 10px;
&>div {
margin-left: 20px;
} .toggleIcon {
width: 14px;
height: 14px;
border: 1px solid #dcdcdc;
@include wordStyle(#dcdcdc, 14px, 600); text-align: center;
line-height: 11px;
cursor: pointer;
position: absolute;
left: 10px;
margin-top: 10px;
} .checkGroup {
display: flex;
flex-direction: column;
padding-left: 20px;
}
/deep/ .el-checkbox {
&+.el-checkbox {
margin-left: 0;
}
}
/deep/ .el-checkbox__inner {
&: hover {
border-color: #ed795a;
}
&:focus {
border: 1px solid #dcdfe6;
outline: none;
}
}
/deep/ .el-checkbox__input {
&.is-checked,&.is-indeterminate {
.el-checkbox__inner {
background-color: #ed795a;
border-color: #ed795a;
}
}
&.is-checked {
&+.el-checkbox__label {
color: #ed795a;
}
}
}
/deep/ .el-checkbox__label {
font-size: 12px;
padding-left: 0;
}
/deep/ .el-checkbox {
position: relative;
} .icon-zhu {
position: absolute;
left: -24px;
span { display: inline-block;
width: 18px;
height: 18px;
line-height: 18px;
text-align: center;
border-radius: 100%;
color: #fff;
font-weight: bold;
background-color: #ccc;
} .colorful-icon {
background-color: #ed795a;
}
.checkBox-num {
position: absolute;
right: 10px;
font-size: 12px;
}
}
</style>
数据结构如下
menus: [{
    id: "1",
    name: "不限量173套餐",
    num: "23789446464646",
    checkAll: false,
    checkedCities: [],
    //v-model绑定
    isIndeterminate: false,
    //设置 indeterminate 状态,只负责样式控制
    isShowAll: true,
    //控制展开和收缩的状态
    userList: [{
        id: "1.1",
        username: "html",
        role: "主管",
        telType: "移动电话",
        cardType: "主号",
        label: "现行",
        num: "17316065935"
    }, {
        id: "1.2",
        username: "vue",
        role: "普通",
        telType: "有线宽带",
        cardType: "",
        label: "现行",
        num: "hz87654321"
    }, {
        id: "1.3",
        username: "vue",
        role: "普通",
        telType: "移动电话",
        cardType: "副号",
        label: "现行",
        num: "17316065937"
    }]
}, {
    id: "1",
    name: "不限量199套餐",
    num: "23789446464646",
    checkAll: false,
    checkedCities: [],
    //v-model绑定
    isIndeterminate: false,
    //设置 indeterminate 状态,只负责样式控制
    isShowAll: true,
    userList: [{
        id: "1.1",
        username: "html",
        role: "主管",
        telType: "有线宽带",
        cardType: "",
        label: "现行",
        num: "hz1234567"
    }, {
        id: "1.2",
        username: "vue",
        role: "普通",
        telType: "移动电话",
        cardType: "副号",
        label: "现行",
        num: "19916065934"
    }, {
        id: "1.3",
        username: "vue",
        role: "普通",
        telType: "移动电话",
        cardType: "副号",
        label: "现行",
        num: "19916065936"
    }]
}]
vue结合element UI做checkbox全选的tree结构的更多相关文章
- angularjs实现 checkbox全选、反选的思考
		
之前做了一周的打酱油测试,其实感觉其实测试也是上辈子折翼的天使. 好长时间没写代码,感觉好多都不会了. 感谢这周没有单休,我能看熬夜看奥运了.我能有时间出去看个电影,我能有时间出去逛个商城,我能有时间 ...
 - jQuery设置checkbox全选(区别jQuery版本)
		
jQuery设置checkbox全选在网上有各种文章介绍,但是为什么在我们用他们的代码的时候就没有效果呢? 如果你的代码一点错误都没有,先不要急着怀疑人家代码的正确性,也许只是人家跟你用的jQuery ...
 - Jquery学习之路(一)  实现checkbox全选方法
		
昨天早上有写到怎么利用Jquery实现全选 根据大家的意见对程序中一些写法不好的地方进行了修改,也是本人水平有限,存在各种考虑不到的地方. 文章最后我提出了一个问题,要写一个通用的方法来调用,于是就有 ...
 - 关于input[type='checkbox']全选的问题
		
今天在做一个全选功能的时候,发现了一个问题,就是如果我在选择全选之前,我就已经选择了一个input,然后我再去选择全选并且以后再取消全选的时候,这个我之前选择的input始终处于选择状态,但是他的ch ...
 - vue 入门 ------简单购物车功能实现(全选,数量加减,价格加减)
		
简易购物车功能(无任何布局 主要是功能) 数量的加减 商品的总价钱 全选与全不选 删除(全选.价格 受影响) <script src="https://cdn.jsdelivr.net ...
 - vue实现功能 单选 取消单选 全选 取消全选
		
vue实现功能 单选 取消单选 全选 取消全选 代码部分 <template> <div class=""> <h1>全选框</h1> ...
 - TreeView checkbox 全选
		
在使用TreeView 控件 ,进行权限管理的时候,需要使用 checkbox全选. 勾选父节点,子节点全部选中.取消父节点,子节点不选中. 勾选子节点,父节点也选中. 以下是在使用的例子: < ...
 - JS checkbox 全选 全不选
		
/* JS checkbox 全选 全不选 Html中checkbox: <input type="checkbox" name="cbx" value= ...
 - checkbox全选,反选,取消选择 jquery
		
checkbox全选,反选,取消选择 jquery. //checkbox全部选择 $(":checkbox[name='osfipin']").each(function(){ ...
 - js初学—实现checkbox全选功能
		
布局如下: <p ><input type="checkbox" id="che1"/>全选</p><div id=& ...
 
随机推荐
- ComfyUI 基础教程(二) —— Stable Diffusion 文生图基础工作流及常用节点介绍
			
上一篇文章讲解述首次启动 ComfyUI 会自动打开一个最基础的文生图工作流.实际上,后续我们可以通过菜单选项,或者快捷键 ctrl + D来打开这个默认工作流.默认工作流如下: 这是一个最基础的文生 ...
 - 《Effective TypeScript》条款21 - 类型扩展
			
本文主要通过一些实际的代码示例,来帮助大家理解什么是类型扩展,本文主要内容如下: 什么是类型扩展 代码示例 总结 什么是类型扩展? TypeScript 需要从你指定的单一值中决定一组可能的值,这个过 ...
 - ASP.NET Core – Dependency Injection
			
前言 很久很久以前就写过了 Asp.net core 学习笔记 ( DI 依赖注入 ), 这篇只是整理一下而已. 参考 Using dependency injection in a .Net Cor ...
 - 二叉树的 Morris 中序遍历——O(1)空间复杂度
			
回顾 问题陈述: 给定一棵二叉树,实现中序遍历并返回包含其中序序列的数组 例如给定下列二叉树: 我们按照左.根.右的顺序递归遍历二叉树,得到以下遍历: 最终中序遍历结果可以输出为: [3, 1, 9, ...
 - 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
			
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本v6. ...
 - cortex-m3 m4 异常机制
			
文章写的很好,待整理 1.[STM32]HardFault问题详细分析及调试笔记 https://blog.csdn.net/m0_54916619/article/details/129979222 ...
 - spring 拦截器实现token校验登录
			
pom文件 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</art ...
 - 【赵渝强老师】删除表和Oracle的回收站
			
一.Oracle的Drop Table语句 首先,我们来看一下Oracle Drop Table的语法格式. 解释一下里面的参数: schema Schema表示方案名称,这里可以理解为用户名,缺省为 ...
 - 搜广推算法校招面试:BOSS直聘 推荐搜索系统工程师
			
本文介绍2024届秋招中,BOSS直聘的推荐/搜索系统工程师岗位一面的面试基本情况.提问问题等. 2023年12月,赶在秋招的末尾,投递了BOSS直聘的推荐/搜索系统工程师岗位,并不清楚所在的 ...
 - 五款扩展组件齐发 —— Volcano、Keda、Crane-scheduler 等,邀你体验
			
今年 3 月,KubeSphere 启动了首届扩展组件开发者训练营,吸引了 60 名开发者报名.经过一个半月的密集培训和实战演练,这些开发者成功打造了五款创新的扩展组件,现已全部上架至 KubeSph ...