elementui树形复选框,element-ui checkbox 组件的树形联动
前言
示例版本为 Element-ui 2.13.0 + Vue 2.6.11
最近想弄 Element-ui checkbox 的多级联动,网上相关的例子大多数为二级联动,自己研究了一下,弄了一个树形菜单的多级联动,常用于角色管理等业务。(仅供参考,未考虑性能问题)
数据模型
[
{
"menu": {
"id":14,
"menuName":"测试管理',
"parentId":0
} ,
"menuOptionsList":[
{
"id":46,
"optionsName":"列表",
"checked":false
},
{
"id":47,
"optionsName":"新增",
"checked":false
}
],
"children":[],
"checked":false
}
]复制代码
这里展示的最顶级的数据结构,下级数据只需要在 children 中添加即可。需要注意的是 checked 属性,本身数据库表中没有这个数据,需要后台建立一个 VO 映射实体将 checked 字段添加进去,默认值为 false.
逻辑处理
html 使用 el-table + el-chekbox 展示:
:data="menuList"
border
fit
size="mini"
highlight-current-row
row-key="menu.id"
:default-expand-all="true"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
v-model="scope.row.checked"
:indeterminate="scope.row.indeterminate"
@change="handleCheckAllChange(scope.row, $event)">
{{ scope.row.menu.menuName }}
v-for="options in scope.row.menuOptionsList"
:key="options.id"
v-model="options.checked"
:label="options.optionsName"
@change="handleCheckChange(scope.row)"
/>
复制代码
核心方法 handleCheckAllChange 和 handleCheckChange 这两个方法,handleCheckAllChange 是 菜单选项 列按钮被点击的事件,handleCheckChange 是 选项列表 列被点击的事件。
handleCheckAllChange(菜单列改变事件)
handleCheckAllChange(val, checked) {
// 有下级去处理下级
if (val.children.length > 0) {
// 递归设置子级选中状态
this.findChildren(val.children, checked)
} else {
// 无下级处理本级
val.menuOptionsList.forEach(options => { options.checked = checked })
}
// 处理上级
if (val.menu.parentId !== 0) {
递归设置上级选中状态
this.findParent(this.menuList, val.menu.parentId)
}
// 设置全选的未全部选中的状态
val.indeterminate = false
}
复制代码
根据数据中 children 的长度来判断是否存在下级,如果存在就执行递归方法 findChildren 将子类的 checked 属性设置为 true,不存在处理本级的 checked 属性即可。需要注意的是 parentId 等于 0 证明当前菜单父级为顶级菜单,不需要再向上寻找。以此为判断依据来进行父级菜单的判断条件。 如果 parentId 不等于 0 说明当前全选的菜单存在父级,需要将父级的选项框进行状态设置。
handleCheckChange(选项列改变事件)
handleCheckChange(val) {
const length = val.menuOptionsList.length
let checkedLength = 0
val.menuOptionsList.forEach(options => {
if (options.checked) {
checkedLength++
}
})
val.checked = checkedLength === length
val.indeterminate = checkedLength > 0 && checkedLength < length
// 处理上级
if (val.menu.parentId !== 0) {
this.findParent(this.menuList, val.menu.parentId)
}
}
复制代码
这个方法对应着 选项列表 列选中的状态,需要对 菜单名称 列的全选状态进行控制。首先通过变量 length 获取到当前数据行选项列表的数量,遍历选项数组根据 checked 的状态获取到已选中的选项数量。val.checked 代表当前列是否全选,val.indeterminate 代表当前列是否有选项被选中。但是这只是处理了当前行的状态,当前行可能是某一菜单的子集,所以需要由下向上的去寻找菜单的父级并设置选中状态。这里同样用到了上面方法中的 findParent 函数。
findChildren(递归查询子集)
findChildren(list, checked) {
list.forEach(children => {
children.checked = checked
children.indeterminate = false
children.menuOptionsList.forEach(options => {
options.checked = checked
if (children.children.length > 0) {
this.findChildren(children.children, checked)
}
})
})
}
复制代码
findParent(递归查询父集)
findParent(list, parentId) {
list.forEach(result => {
let parentCheckedLength = 0
let parentIndeterminateLength = 0
if (result.menu.id === parentId) {
result.children.forEach(children => {
if (children.indeterminate) {
parentIndeterminateLength++
} else if (children.checked) {
parentCheckedLength++
}
})
result.checked = parentCheckedLength === result.children.length
result.indeterminate = (parentIndeterminateLength > 0 || parentCheckedLength > 0) && parentCheckedLength < result.children.length
if (result.menu.parentId !== 0) {
this.findParent(this.menuList, result.menu.parentId)
}
} else if (result.children.length > 0) {
this.findParent(result.children, parentId)
}
})
}
复制代码
完整示例
由于源码篇幅过长,暂时将源码放到 GitHub 了,希望可以帮助到你。
elementui树形复选框,element-ui checkbox 组件的树形联动相关推荐
- ElementUi Table复选框回显
ElementUi Table复选框回显 UI代码: <el-table :data="acctSettleHangAccountList" style="widt ...
- element表格实现树形全选_vue+element UI实现树形表格带复选框的示例代码
一:在component文件夹下新建如下treeTable文件夹,里面有2个文件: eval.js:将数据转换成树形数据 /** * @Author: jianglei * @Date: 2017-1 ...
- vue elementui table 复选框
1.el-table 中加入事件@selection-change="handleSelectionChange" <el-table-column type=" ...
- elementui树形复选框_Element-ui表格树形控件结合复选框实践
Element-ui是现在国内用得比较多的ui框架,其table组件提供了多选以及树形数据的功能,但却没有提供将两者结合的功能,我们先来看下面的图片,本文将介绍以下的功能如何实现以及其中的一些踩坑点. ...
- vue+elementUI三级复选框 checkbox (角色管理)
话不多说直接上代码,直接复制新页面运行就ok,有问题大佬们请留言一起讨论, 效果图 代码如下 <template><el-scrollbar style="height: ...
- android 多个复选框,Android UI控件之CheckBox(复选框、多选框)
上一篇文章中学习了RadioButton.知道了RadionButton的基本用法,实现起来也是听简单的 和RadioButton一样CheckBox也是一个使用的非常多的控件,Android中它的的 ...
- html复选框读取数据库,checkbox 读取数据库
JS弄ASP.NET(C#)在页GridView信息选择行 ${textbanner3.replace("\n","")} 文章 eddie小英俊 2017-1 ...
- elementui复选框组使用与遇到的问题
elementui复选框组使用与遇到的问题 1.复选框组使用 2.默认值的设置 3.遇到的问题 3.1.导致问题的写法 3.2.正常可以使用的写法 4.事件冒泡的问题 今天有个弹出窗编辑的时候elem ...
- 复选框(checkbox)、单选框(radiobox)的使用
复选框(checkbox).单选框(radiobox)的使用 复选框: HTML: // 复选框 <input type="checkbox" name="chec ...
最新文章
- keras 的 example 文件 neural_doodle.py 解析
- JavaScript检测之basevalidate.js
- 【UE4】二十三、UE4笔试面试题
- ES6函数第一篇:参数篇
- linux命令学习-4-lsof
- [JavaWeb-XML]XML_解析_解析方式
- Window10:不能建立到远程计算机的连接。你可能需要更改此连接的网络设置。
- 阮一峰的Javascript模块化编程(三):require.js的用法
- JavaScript重难点解析2(立即执行函数IIFE,this关键字)
- html5画电池状态,JavaScript里获取电池状态的方法
- Linux网络下载管理工具(lftp, ftp, lftpget, wget)
- robotium和appium的一些区别(转)
- 迅雷离线下载免费申请体验(3天)
- 微风:什么是UI设计?
- opencv检测图片失焦 python_如何在Python中使用OpenCV执行模糊检测
- google离线地图实例,加载本地地图瓦片, 支持点线面及图文标注,坐标定位,卫星、电子地图切换
- 【讲解】缺席的神官——动态规划模型
- Python+Vue计算机毕业设计校园旧物交易系统iv9w4(源码+程序+LW+部署)
- 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现
- MCP3424的使用说明
热门文章
- dexpress 流程图_DevExpress常用操作
- bash: mysqldump: command not found
- flowable 和 activty工作流 使用视图方案解决系统内部用户、组、用户和组关联
- (Docker实战) 第4篇:Centos7 拉取和部署Redis
- RabbitMQ 镜像集群配置_05
- STS安装 activiti-designer-5.18.0插件
- Spring获取JavaBean的xml形式和注解形式
- windows2012运行linux,Linux一分钟部署完毕上线运行,windows server你要折磨我两天?...
- 直接内存与元空间_深入浅出 JVM 内存管理
- java vector 输出_5.7(java学习笔记)Vector、Enumeration