element ui树形表格如下:

它的数据格式为:使用children字段来存放子级数据

      tableData: [{id: 1,date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",children: [{id: 31,date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{id: 32,date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},],},{id: 4,date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄",},],

element ui 树形&懒加载 表格如下:

默认是不请求子级数据的,当点击下拉icon时再发起请求

完整代码:

DOM:  需注意以下属性

row-key="id"

lazy

:load="load"

:tree-props="{

children: 'children',

hasChildren: 'hasChildren',

}"

  <el-table:data="tableData1"style="width: 100%"row-key="id"borderlazy:load="load":tree-props="{children: 'children', hasChildren: 'hasChildren'}"><el-table-columnprop="date"label="日期"width="180"></el-table-column><el-table-columnprop="name"label="姓名"width="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table>

数据:就是普通的数组,没有子级数据的概念

      tableData1: [{id: 1,date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{id: 2,date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{id: 3,date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",hasChildren: true,},{id: 4,date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄",},],

懒加载事件:

    load(tree, treeNode, resolve) {// 这里发请求,请求当前点击的子级数据data,然后交给resolve处理,就可以正确展示子级数据setTimeout(() => {resolve(data);}, 300);},

发现树形懒加载多选表格有两个问题:

1、勾选父级时子级不会勾选上

一般我们实现表格多选功能是这样的:这里不再使用这种方式

     <el-table-columntype="selection"width="55"></el-table-column>

 第一步:需要我们手动写个勾选表头和勾选列

        <el-table-column type="test" align="left" width="55"><!-- 表头的全选勾选框,indeterminate:是否半选状态,handleCheckAllDetail:全选事件 --><template slot="header" slot-scope="scope"><el-checkbox:indeterminate="isIndeterminate"v-model="checkAllDetail"@change="handleCheckAllDetail"></el-checkbox></template><!-- 表格数据列单行勾选框,使用checked属性决定是否勾选,单行勾选事件 --><template slot-scope="scope"><el-checkboxv-model="scope.row.checked"@change="handleCheckDetail(scope.row, $event)"></el-checkbox></template></el-table-column>

第二步: 定义数据

    checkAllDetail: false,isIndeterminate: false,

第三步:编写handleCheckAllDetail、handleCheckDetail函数,

每次勾选时要做的事:

处理全选、半选状态;

用个数组处理勾选行的数据,勾选时将数据存起来,取消勾选时将数据删除;

若勾选父级时,将子级的数据也全部勾选;取消勾选反之;

若勾选子级时,也要计算父级是否应该勾选上;

第四步:点击下拉icon时也要数据子级数据的勾选状态

这里涉及到一个很重要的问题:如何拿到子级数据:先给表格绑定ref属性

this.$refs.mulTable.store.states.lazyTreeNodeMap这个可以取到所有展开的子级数据

数据格式为:{父级id1: [{子数据1}, {子数据2}],  父级id2: [{子数据}] }

举个例子:当勾选单个数据时如何处理

 // 单条数据的勾选操作handleCheckDetail(row, val) {// 如果勾选的是子级数据:那么要计算子级决定父级勾选状态if (row.parent) {let parentId = row.parent; //父级idlet loadChildData = this.$refs.mulTable.store.states.lazyTreeNodeMap; // 所有展开项的懒加载数据let parentItem = loadChildData[parentId]; //当前父级下的所有子数据// 判断当前下的所有子数据是否全部勾选上了let checked = parentItem?.every(function (currentValue, index, arr) {return currentValue.checked;});// 设置父级数据的勾选状态for (let i = 0; i < this.list.length; i++) {if (this.list[i].id === parentId) {this.$set(this.list[i], "checked", checked);}}// 勾选则将id添加进去,否则删除id【selectArrIds是用来存放勾选数据的id的数组】if (checked) {this.selectArrIds.push(parentId);} else {let index = this.selectArrIds.indexOf(parentId);if (index !== -1) {this.selectArrIds.splice(index, 1);}}} else {// 如果当前点击的是父级数据:那么父级决定子级状态let loadChildData = this.$refs.mulTable.store.states.lazyTreeNodeMap; // 所有展开项的懒加载数据let datas = loadChildData[row.id]; //当前父级下的所有子数据// 将父级的勾选状态同步给子级datas?.forEach((item) => {this.$set(item, "checked", val);});// 勾选则将id添加进去,否则删除id【selectArrIds是用来存放勾选数据的id的数组】if (val) {this.selectArrIds.push(row.id);} else {let index = this.selectArrIds.indexOf(row.id);if (index !== -1) {this.selectArrIds.splice(index, 1);}}}// 计算半选和全选状态let totalCount = this.list.length;this.checkAllDetail =totalCount === this.selectArrIds.length ? true : false;this.isIndeterminate =this.selectArrIds.length > 0 && this.selectArrIds.length < totalCount;},

当勾选全选checkbox时如何处理

    handleCheckAllDetail(val) {this.isIndeterminate = false;let setIds = [];this.list.forEach((item, index) => {if (val &&this.selectArrIds.indexOf(item.id) === -1) {setIds.push(item.id);}});if (val) {this.selectArrIds = setIds;} else {this.selectArrIds = [];}// 若有展开项,则将子级也勾选上this.setChildCheck(val);},

setChildCheck方法:

    // 设置子级的数据勾选状态setChildCheck(val) {let loadChildData = this.$refs.mulTable.store.states.lazyTreeNodeMap;if (Object.keys(loadChildData).length > 0) {let keys = [];for (let key in loadChildData) {keys.push(key);}for (let i = 0; i < keys.length; i++) {let datas = loadChildData[keys[i]];datas?.forEach((item) => {// 按父级的勾选状态去控制子级的勾选状态let isChecked;for (let i = 0; i < this.list.length; i++) {if (this.list[i].id === item.parent) {isChecked = this.list[i].checked;}}this.$set(item, "checked", isChecked);});}}},

效果如下:

element ui懒加载树形表格-勾选

2、对子级数据进行删除、修改、添加操作时,不会更新子级数据

这个问题目前还没实现,但是估计也是通过this.$refs.mulTable.store.states.lazyTreeNodeMap处理数据,稍后更新~~

PS:后来发现了另外一个非常棒的UI库,可以考虑使用~~

vxe-table v4

element ui 树形-懒加载-表格-多选 勾选问题相关推荐

  1. element tree ui 全选_element-ui Tree之懒加载叶子节点设置半选效果

    本来是不太想动的... 无可奈何,看到一句话[业精于勤, 荒于嬉]便还是动手写一写加深理解的同时给以后的自己留个备份吧... element-ui Tree组件如何给具有懒加载的tree设置半选效果? ...

  2. iOS开发UI篇—懒加载

    iOS开发UI篇-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...

  3. layui树形懒加载_layui树形表格支持非异步和异步加载

    layui树形表格支持非异步和异步加载. 使用示例如下: 展开全部 展开一层 折叠全部 折叠一层 layui.config({ base: '/uui/treetable-lay/module/' } ...

  4. SAP Commerce Cloud (电商云) UI 的懒加载功能

    最近工作中处理了 SAP Commerce Cloud (电商云) UI 的一个懒加载 (Lazy Load) 功能的问题,这里把自己学到的东西做个记录. UI 懒加载,有时又称惰性加载,延迟加载,是 ...

  5. iOS开发UI中懒加载的使用方法

    1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...

  6. Ztree加载完成后显示勾选节点

    ①前言:这个在度娘上没有搜到解决的办法,于是自己查看了ztree的API,发现其实还是比较简单的.做个笔记以备不时之需. ②需求: 像下图一样,在加载完成之后就显示需要勾选的项. ③解决方案: 首先页 ...

  7. element-ui 树形表格 懒加载 手风琴模式 拖动排序

    手风琴模式 实现的效果: 其中一个节点展开时,其他节点关闭,一直保持最多只有一个节点是展开的. 需要解决的问题: element-ui 树形懒加载表格自带的节点展开时,默认只有第一次才会触发load函 ...

  8. element中树形数据与懒加载实现全部展开和全部收起

    element中属性懒加载数据 default-expand-all属性::是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效 如果在表格头上加上一个按钮实现全部展开与收起 类似如 ...

  9. vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查

    以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...

最新文章

  1. LeetCode 24 Swap Nodes in Pairs(交换序列中的结点)
  2. highcharts使用教程
  3. 网站托管运营需要注意哪些内容?
  4. python 操作 表格
  5. 实现分页的通用存储过程
  6. mysql输出美式报表_Navicat for MySQL 如何预览报表
  7. 大学生利用漏洞薅肯德基羊毛,获刑两年半
  8. android 修改系统参数设置,Android获取与设置系统环境变量的方法指南
  9. Vue 使用 fraola——vue-froala-wysiwyg
  10. ubuntu 完整学习资料
  11. 计算机英语单词练习四
  12. System32、SysWOW64与SysNative文件夹
  13. java useragent 360 遨游 火狐_Chrome与火狐修改浏览器User Agent教程
  14. 计算机如何正确开关机,初学台式机电脑开关机的正确操作 电脑定时关机的基础知识...
  15. Arduino通过RXTX联通JAVA实现数字温度计案例
  16. “智能对话机器人”离“智能”还有多远?
  17. 怎么通过在线PS修图 修图工具有什么
  18. 使用Echarts实现圆环图
  19. cleanmymac如何更新Mac上的所有软件?
  20. 矩阵化为最简型矩阵JAVA语言实现――线性代数

热门文章

  1. C语言控制台小游戏 | 打飞机
  2. python 易犯错误之input()
  3. python中config(state=disabled)_暂停python tkinter中的事件
  4. STM32控制NBIOT模块收发信息(附代码)
  5. 笔记-NopCommerce系统架构分析-引擎和依赖管理IOC
  6. 奇酷学院-MySQL 的安装
  7. Dell 电脑蓝屏0xc0000001解决办法
  8. 前端:弹幕标签用法详细介绍(跑马灯)
  9. Simple Thoughts
  10. 什么是java常量_java常量是什么?