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

在上面的Gif中,当我们点击高层级的checkbox时,低层级的checkbox也会一并被勾选。取消的时候则一起被取消。要实现这个功能,我们首先得关注待渲染的数据结构。

tableData: [{

id: 1,

date: '2016-05-02',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1518 弄'

}, {

id: 2,

date: '2016-05-04',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1517 弄'

}, {

id: 3,

date: '2016-05-01',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1519 弄',

children: [{

id: 31,

date: '2016-05-01',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1519 弄'

}, {

id: 32,

date: '2016-05-01',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1519 弄',

children: [{

id: 61,

date: '2016-05-01',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1519 弄'

}, {

id: 62,

date: '2016-05-01',

name: '王小虎',

checked: false,

address: '广州市普陀区金沙江路 1519 弄'

}]

}]

}, {

id: 4,

date: '2016-05-03',

name: '王小虎',

checked: false,

address: '上海市普陀区金沙江路 1516 弄'

}]

复制代码

每一行待渲染的数据都有其对应的checked,可以通过这个key绑定对应的checkbox,有一些数据有children,其为数组形式,这就是待渲染的子树,数组内的对象同样有checked属性,也同样可以有children属性(非必须),当然实际开发中数据结构不一定这么简单,这时就必须通过改变数据结构来改造数组了,个人认为数据结构是一个优秀的程序员必须了解和学习的。

使用template可以自定义我们想要的内容,我们可以通过对应数据的checked绑定每一行的checkbox,使用slot="header"可以自定义表头,因此最终我们可以写出以下代码

@change="handleCheckedAll"/>

@change="handleCheckedOne(scope.row)"/>

复制代码

checkedAll用于与表头绑定,handleCheckedAll和handleCheckedOne(scope.row)足够我们完成后续的功能,但你会发现一个问题,表头的checkbox无法被勾选,控制台也不会报错,解决方法是在slot="header"后添加slot-scope="scope",同时将scope传入handleCheckedAll,即使传入的scope并不需要用到。

当我们勾选父级checkbox时,对应的子级checkbox也执行了相同的逻辑,子级可以还会有自己的子级,在其下面可能还存在着子级。这时,你很容易想到递归,事实上递归在解决树类问题确实实用性很高。

// boolValue接收一个布尔值

checkOne(obj, boolValue) {

obj.checked = boolValue

// 判断存不存在children,存在就递归赋值

if (obj.children) {

obj.children.forEach(item => this.checkOne(item, boolValue))

}

},

// 绑定每一行checkbox的change事件

handleCheckedOne(row) {

if (row.checked) {

this.checkOne(row, true)

} else {

this.checkOne(row, false)

}

}

复制代码

当我们要点击表头的checkbox来改变所有的行的checkbox的时候,我们要改变的就是数组了。

checkAll(arr, boolValue) {

arr.forEach(item => {

item.checked = boolValue

// children同样是数组

if (item.children) {

this.checkAll(item.children, boolValue)

}

})

},

handleCheckedAll(scope) {

// 实际上scope并没有什么用处,仅为了解决上面提到的表头checkbox不显示的bug

// console.log(scope.column)

if (this.checkedAll) {

this.checkAll(this.tableData, true)

} else {

this.checkAll(this.tableData, false)

}

}

复制代码

遍历每一行执行checkOne()也是一种实现checkAll()的做法,但你还得处理最外层数据的checkbox,个人认为这样反而使得代码逻辑不清晰,泛用性差。

递归在为每一个节点添加checked以及获取上述数据的id都有使用到,本文仅展示其在父子树关联这方面的作用。如果我的文章帮到了你,请给我点个赞吧!!!

elementui树形复选框_Element-ui表格树形控件结合复选框实践相关推荐

  1. 5、Web 窗体的基本控件——复选框控件和复选组控件(CheckBox 和 CheckBoxList)

    5.Web 窗体的基本控件--复选框控件和复选组控件(CheckBox 和 CheckBoxList) 复选框控件和复选组控件(CheckBox 和 CheckBoxList) 前端 <%@ P ...

  2. android 代码控件框高,Android控件_TextView(显示文本框控件)

    一.TextView控件的常用属性 1.android:id--控件的id 2.android:layout_width--设置控件的宽度 wrap_content(包裹实际文本内容) fill_pa ...

  3. Android开发CheckBox控件,全选,反选,取消全选

    在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...

  4. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  5. asp.net DataGridTree表格树控件 下拉树 DropTree c# .net

    1.下拉树 DropTree c# .net 下拉树实现原理 输出json到客户端 客户端实现动态加载 中间不会和服务端交互 数据量支持上 经测试 几千 还是很快的 本下拉树控件是用c#+js树实现 ...

  6. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇-UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  7. C#学习笔记(20140911)-下拉框、日历、pannel控件的使用

    晚上学习了下拉框.日历.pannel控件的使用,这几个控件看上去好像没有之前的一些控件那么简单,但是使用起来还是很方便.使用完了后,才发现真的和之前的几种控件差不多. 最了一个小小的模块:每日签到填写 ...

  8. 关于讯飞语音听写RecognizerDialog 去除这个弹框view中的任何控件 更改其中内容

    | | | 上面这是讯飞语音听写sdk的听写弹框下面两张是自己项目中改的 我发现他sdk的assets下的iflytek 中的recognize.xml 里面虽然是乱码 但是可以看到的一些东西是此倾听 ...

  9. MFC学习--下拉框、列表、树控件、选项卡

    下拉框.列表.树控件.选项卡 下拉框 属性 代码操作 列表控件 属性 代码操作 树控件 属性 代码操作 选项卡 属性 代码操作 文化建设 下拉框 属性 Data: 下拉可选项,用分号分隔( ; ) T ...

  10. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇-UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) 1 #import <Foundation/Foundation.h&g ...

最新文章

  1. Lambda架构与推荐在电商网站实践
  2. 94 Binary Tree Inorder Traversal
  3. c语言绘制路面图形代码,道路纵断面绘图程序的开发.pdf
  4. 1575 Gcd and Lcm
  5. 基于按位与的 就散策略_比较散列策略
  6. 怎么用PHP建立购物网站,如何使用PHP建设一个购物网站
  7. java跨函数跳转_VS code 函数无法跨文件跳转到定义
  8. MarkDown/Html在线转换(支持代码高亮,可复制到微信公众号、今日头条)
  9. 飞鸽传书2012绿色版
  10. ECCV 2020 Spotlight 谷歌论文大盘点
  11. Namenode双机热备之Pacemaker
  12. 获取当前scn号scn1_Checkpoint和SCN的解析
  13. 小白设计模式:访问者模式
  14. 《数字图像处理》题库1:选择题
  15. matlab中符号检验,配对符号秩和检验,配对资料的符号检验,符号
  16. 网络打印协议之LPR或RAW
  17. Java MultipartFile实现文件上传(一)
  18. 优化华为云服务器采用Key登陆
  19. 【Java基础系列教程】第二章 Java语言概述、配置环境变量
  20. 蓝桥杯软件组如何混进省一

热门文章

  1. 1.9 Lambda表达式遍历Collection集合
  2. Codeforces Round #494 (Div. 3)【未完结】
  3. Spring boot删除员工
  4. python数据库编程dbf_python读写dbf文件
  5. 一天1个机器学习知识点(二)
  6. 面试:你说一下 MyBatis 事务吧!
  7. 蓝桥杯java第八届第二题--纸牌三角形
  8. 数据库隔离级别---MySQL的默认隔离级别就是Repeatable,Oracle默认Read committed,最高级别Serializable
  9. 工具--Eclipse/MarkDown/XMind文章分类目录
  10. Sharding-JDBC改写自己查询规则思路