element ui 树形-懒加载-表格-多选 勾选问题
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 树形-懒加载-表格-多选 勾选问题相关推荐
- element tree ui 全选_element-ui Tree之懒加载叶子节点设置半选效果
本来是不太想动的... 无可奈何,看到一句话[业精于勤, 荒于嬉]便还是动手写一写加深理解的同时给以后的自己留个备份吧... element-ui Tree组件如何给具有懒加载的tree设置半选效果? ...
- iOS开发UI篇—懒加载
iOS开发UI篇-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- layui树形懒加载_layui树形表格支持非异步和异步加载
layui树形表格支持非异步和异步加载. 使用示例如下: 展开全部 展开一层 折叠全部 折叠一层 layui.config({ base: '/uui/treetable-lay/module/' } ...
- SAP Commerce Cloud (电商云) UI 的懒加载功能
最近工作中处理了 SAP Commerce Cloud (电商云) UI 的一个懒加载 (Lazy Load) 功能的问题,这里把自己学到的东西做个记录. UI 懒加载,有时又称惰性加载,延迟加载,是 ...
- iOS开发UI中懒加载的使用方法
1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载 ...
- Ztree加载完成后显示勾选节点
①前言:这个在度娘上没有搜到解决的办法,于是自己查看了ztree的API,发现其实还是比较简单的.做个笔记以备不时之需. ②需求: 像下图一样,在加载完成之后就显示需要勾选的项. ③解决方案: 首先页 ...
- element-ui 树形表格 懒加载 手风琴模式 拖动排序
手风琴模式 实现的效果: 其中一个节点展开时,其他节点关闭,一直保持最多只有一个节点是展开的. 需要解决的问题: element-ui 树形懒加载表格自带的节点展开时,默认只有第一次才会触发load函 ...
- element中树形数据与懒加载实现全部展开和全部收起
element中属性懒加载数据 default-expand-all属性::是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效 如果在表格头上加上一个按钮实现全部展开与收起 类似如 ...
- vue+element实现树状表格的增删改查;使用el-table树形数据与懒加载实现树状表格增删改查
以下代码可以直接复制使用 一.情景: 列表是一个树状表格,可以无限添加下级,以及对列表的某一行进行增删改查(目前查没有写). 原博链接 二.本篇是在原博主的代码基础上添加了部分功能. 功能1: 给树状 ...
最新文章
- LeetCode 24 Swap Nodes in Pairs(交换序列中的结点)
- highcharts使用教程
- 网站托管运营需要注意哪些内容?
- python 操作 表格
- 实现分页的通用存储过程
- mysql输出美式报表_Navicat for MySQL 如何预览报表
- 大学生利用漏洞薅肯德基羊毛,获刑两年半
- android 修改系统参数设置,Android获取与设置系统环境变量的方法指南
- Vue 使用 fraola——vue-froala-wysiwyg
- ubuntu 完整学习资料
- 计算机英语单词练习四
- System32、SysWOW64与SysNative文件夹
- java useragent 360 遨游 火狐_Chrome与火狐修改浏览器User Agent教程
- 计算机如何正确开关机,初学台式机电脑开关机的正确操作 电脑定时关机的基础知识...
- Arduino通过RXTX联通JAVA实现数字温度计案例
- “智能对话机器人”离“智能”还有多远?
- 怎么通过在线PS修图 修图工具有什么
- 使用Echarts实现圆环图
- cleanmymac如何更新Mac上的所有软件?
- 矩阵化为最简型矩阵JAVA语言实现――线性代数