0


< element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >

在这里插入图片描述

文章目录


👉 前言

在 Vue + elementUi 开发中,elementUI中表格在本身是自带多选功能的,但是在某些情况下,并不能完全适用,甚至可能产生bug。例如本次案例所遇Bug,情景如下:

本案例场景:在表单中,

通过表单参数筛选某个明细表格数据

,后端要求新增时可多选明细表格中的内容。但由于明细列表存在

分页

的功能,在回显时,由于element表格提供的

勾选函数

toggleRowSelection(cur, true)

),因为数据不全面,

只勾选了当前分页的内容

且由于业务需要,通常在表格中

多选方法

中都会存储勾选的ID或其他数据的逻辑,这就导致第一次回显勾选的数据,因分页数据导致只勾选当前页中包含的明细,然后触发多选方法,覆盖了回显的数据,导致数据丢失!

接下来,简单阐述下,开发中使用的解决方法!方法并不适用,只提供解决思路,具体问题具体分析!仅供参考!


👉 一、解决思路

遇到这种问题,一般的思路是创建一个中间变量来暂存勾选的内容,但是由于业务复杂度问题,需要在前端切换业务域时,通过本地存储暂存当前相关数据,导致回显时,要考虑的逻辑较多,就排除了再新增变量存储的问题,而且也容易存错,导致二次数据覆盖!

回到问题本身,可以看得出来,是由于分页功能导致的数据回显时,勾选不全的问题。所以就这个问题,与后端沟通,添加 usePage参数,区分是否使用分页,在回显勾选内容的方法内调用,当然这种是基于数据量少的地方才能用,而且需要使用loading,避免长时间加载,导致用户以为页面卡死没数据的情况。

在这里插入图片描述

👉 二、实现代码(仅供参考,具体问题具体分析)

> HTML模板

<el-tableref="multipleTable":data="tableData"tooltip-effect="light":height="tableHeight":max-height="tableHeight":key="formData.ssywy + tableOption.length"style="width: 100%"v-loading="tableLoading"element-loading-text="拼命加载中"element-loading-spinner="el-icon-loading"element-loading-background="rgba(0, 0, 0, 0.8)"row-key="id"@selection-change="handleSelectionChange($event)"><el-table-columntype="selection"width="55"reserve-selectionfixed="left"align="center"></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="params.current":page-sizes="[10, 50, 100, 200]":page-size="params.size"backgroundlayout="prev, pager, next, sizes, jumper, total":total="params.total"></el-pagination>

> Js模板

// 明细列表多选handleSelectionChange(val){this.multipleSelection = val
    // window.console.log(this.formData.ywyAndRuleDTO, this.multipleSelection, val)this.formData.ywyAndRuleDTO[this.formData.ssywy].defectIds = Array.isArray(val)?[...newSet(val.map(item=> item.id))]:[]},// 多选表格asynctoggleSelection(v){// window.console.log(this.formData.ywyAndRuleDTO, v, this.tableData)if(v.length !==0){let params ={...this.params,ruleIds:this.formData.ywyAndRuleDTO[this.formData.ssywy].ruleIds.map(item=> item.id),ywy:this.formData.ssywy,zrdwIds:this.formData.beCheckUnitIds.split(','),flag:this.formData.execStatus !=undefined?false:true,mark:'export'};let rs =awaitthis.riskReVerifyCheckDefectList(params)this.$refs["multipleTable"].clearSelection();this.tableData = rs.rows ||[];
    v.forEach((item)=>{let cur =this.tableData.find((item_1)=>{return item === item_1.id;})if(cur){this.$refs["multipleTable"].toggleRowSelection(cur,true);}});}else{this.$refs["multipleTable"].clearSelection();}},// 查询表格内容asyncqueryTableList(reset){if(reset){this.setPages();}let params ={...this.params,ruleIds:this.formData.ywyAndRuleDTO[this.formData.ssywy].ruleIds.map(item=> item.id),ywy:this.formData.ssywy,zrdwIds:this.formData.beCheckUnitIds.split(','),flag:this.formData.execStatus !=undefined?false:true};this.formData.ywyAndRuleDTO[this.formData.ssywy].selectDTO =JSON.parse(JSON.stringify(params))this.tableData =[];if(!this.formData.ssywy || Array.isArray(this.formData.ywyAndRuleDTO[this.formData.ssywy].ruleIds)&&this.formData.ywyAndRuleDTO[this.formData.ssywy].ruleIds.length ===0){this.$message.warning('请先勾选对应业务域的规则信息!')return}this.tableLoading =true;// 通过异步操作,进行勾选awaitthis.toggleSelection(this.formData.ywyAndRuleDTO[this.formData.ssywy].defectIds)this.riskReVerifyCheckDefectList(params).then((rs)=>{if(rs && Array.isArray(rs.rows)&& rs.rows.length !==0){this.tableData = rs.rows;this.setPages(rs.current, rs.size, rs.records);}else{this.tableData =[];this.setPages();}}).finally(()=>{this.tableLoading =false;});},

案例较为粗浅,仅供参考! 若有大佬有更好的解决方案,希望大佬们赐教! 目前暂时还没想出比较简洁的办法! 该解决方案并不成熟,仅以抛砖引玉!


往期内容 💨

🔥 < 每日闲谈:你真的了解 “ ChatGPT ” 嘛 ? >

🔥 < 每日算法 - JavaScript解析:搜索旋转排序数组 >

🔥 < CSS小技巧:类似photoShop的混合模式(mix-blend-mode / background-blend-mode)使用 >

🔥 <开源: 推荐10个开源的前端低代码项目>

🔥 < CSS小技巧:那些不常用,却很惊艳的CSS属性 >


本文转载自: https://blog.csdn.net/MrWen2395772383/article/details/130158332
版权归原作者 技术宅小温 所有, 如有侵权,请联系我们删除。

“< element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >”的评论:

还没有评论