前言

示例版本为 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 组件的树形联动相关推荐

  1. ElementUi Table复选框回显

    ElementUi Table复选框回显 UI代码: <el-table :data="acctSettleHangAccountList" style="widt ...

  2. element表格实现树形全选_vue+element UI实现树形表格带复选框的示例代码

    一:在component文件夹下新建如下treeTable文件夹,里面有2个文件: eval.js:将数据转换成树形数据 /** * @Author: jianglei * @Date: 2017-1 ...

  3. vue elementui table 复选框

    1.el-table  中加入事件@selection-change="handleSelectionChange" <el-table-column type=" ...

  4. elementui树形复选框_Element-ui表格树形控件结合复选框实践

    Element-ui是现在国内用得比较多的ui框架,其table组件提供了多选以及树形数据的功能,但却没有提供将两者结合的功能,我们先来看下面的图片,本文将介绍以下的功能如何实现以及其中的一些踩坑点. ...

  5. vue+elementUI三级复选框 checkbox (角色管理)

    话不多说直接上代码,直接复制新页面运行就ok,有问题大佬们请留言一起讨论, 效果图 代码如下 <template><el-scrollbar style="height: ...

  6. android 多个复选框,Android UI控件之CheckBox(复选框、多选框)

    上一篇文章中学习了RadioButton.知道了RadionButton的基本用法,实现起来也是听简单的 和RadioButton一样CheckBox也是一个使用的非常多的控件,Android中它的的 ...

  7. html复选框读取数据库,checkbox 读取数据库

    JS弄ASP.NET(C#)在页GridView信息选择行 ${textbanner3.replace("\n","")} 文章 eddie小英俊 2017-1 ...

  8. elementui复选框组使用与遇到的问题

    elementui复选框组使用与遇到的问题 1.复选框组使用 2.默认值的设置 3.遇到的问题 3.1.导致问题的写法 3.2.正常可以使用的写法 4.事件冒泡的问题 今天有个弹出窗编辑的时候elem ...

  9. 复选框(checkbox)、单选框(radiobox)的使用

    复选框(checkbox).单选框(radiobox)的使用 复选框: HTML: // 复选框 <input type="checkbox" name="chec ...

最新文章

  1. keras 的 example 文件 neural_doodle.py 解析
  2. JavaScript检测之basevalidate.js
  3. 【UE4】二十三、UE4笔试面试题
  4. ES6函数第一篇:参数篇
  5. linux命令学习-4-lsof
  6. [JavaWeb-XML]XML_解析_解析方式
  7. Window10:不能建立到远程计算机的连接。你可能需要更改此连接的网络设置。
  8. 阮一峰的Javascript模块化编程(三):require.js的用法
  9. JavaScript重难点解析2(立即执行函数IIFE,this关键字)
  10. html5画电池状态,JavaScript里获取电池状态的方法
  11. Linux网络下载管理工具(lftp, ftp, lftpget, wget)
  12. robotium和appium的一些区别(转)
  13. 迅雷离线下载免费申请体验(3天)
  14. 微风:什么是UI设计?
  15. opencv检测图片失焦 python_如何在Python中使用OpenCV执行模糊检测
  16. google离线地图实例,加载本地地图瓦片, 支持点线面及图文标注,坐标定位,卫星、电子地图切换
  17. 【讲解】缺席的神官——动态规划模型
  18. Python+Vue计算机毕业设计校园旧物交易系统iv9w4(源码+程序+LW+部署)
  19. 车辆姿态表达:旋转矩阵、欧拉角、四元数的转换以及eigen、matlab、pathon方法实现
  20. MCP3424的使用说明

热门文章

  1. dexpress 流程图_DevExpress常用操作
  2. bash: mysqldump: command not found
  3. flowable 和 activty工作流 使用视图方案解决系统内部用户、组、用户和组关联
  4. (Docker实战) 第4篇:Centos7 拉取和部署Redis
  5. RabbitMQ 镜像集群配置_05
  6. STS安装 activiti-designer-5.18.0插件
  7. Spring获取JavaBean的xml形式和注解形式
  8. windows2012运行linux,Linux一分钟部署完毕上线运行,windows server你要折磨我两天?...
  9. 直接内存与元空间_深入浅出 JVM 内存管理
  10. java vector 输出_5.7(java学习笔记)Vector、Enumeration