简介
在使用ruoyi
中,遇到一个问题,没有一个较为完美的解决方案,最终只能妥协一下完成,这里记录一下。
问题
后端返回了这样的数据,如下图
response
这就是我说的属性列表,就是说返回的每一行数据都是包含一个是列表的属性。
如上,就是rows
总数据中的一行中的taskList
,我希望数据能像下面这样展示出来。
表格图
找遍了Element
实在是找不到一个满意的方案。
https://element.eleme.cn/#/zh-CN/component/table#he-bing-xing-huo-lie
Element
确实有一个很像的解决方案,就是上面的,Table
合并行或列的方式
但是,细看了一下,它实现的是将多行返回数据经过函数处理过后,满足条件的行或列进行合并,和我要的不是一回事
我想要的是属性的展示,不是数据的整理。
解决
网上也找了很多方案,也没有满意的,但确实能提供一些不同的思路。
最终考虑两种方案
方案一:表格嵌套,就是既然是一个属性列表那么在那一个表格展示就好
方案二:弹出展示,就是需要查看时点击一个按钮,弹出展示列表数据
两个方案各有好处,但我最终采用的是方案一,原因有下
rows
数据中的workload
属性强相关于这个属性列表,直接展示更能看出其中关系
第二点与第一点有点相似,都是关于展示的“直观”,我修改变化时希望能直接看到父属性变化
基于上面就有了一种方案了
下面看具体实现,需要对ruoyi
分离版的前端有点了解,还有代码并不完整,只说一下关键部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 <el-table border v-loading ="loading" :data ="workloadList" @selection-change ="handleSelectionChange" > <el-table-column type ="selection" width ="55" align ="center" /> ... <el-table-column label ="类型" align ="center" prop ="type" > <el-table-column label ="任务" align ="center" width ="1500" > <template slot-scope ="scope" > <el-table :data ="scope.row.taskList" :stripe ="true" > <el-table-column label ="编号" align ="center" prop ="id" /> <el-table-column label ="人数" align ="center" prop ="headcount" /> <el-table-column label ="人数系数" align ="center" prop ="headcountCoefficient" > <template slot-scope ="scope" > {{ parseFloat(scope.row.headcountCoefficient).toFixed(3) }} </template > </el-table-column > <el-table-column label ="难度系数" align ="center" prop ="degreeCoefficient" > <template slot-scope ="scope" > <el-input v-model ="scope.row.degreeCoefficient" placeholder ="请输入难度系数" /> </template ></el-table-column > <el-table-column label ="单工作量" align ="center" prop ="workload" > <template slot-scope ="scope" > {{ getTaskWorkload(scope.row) }}</template > </el-table-column > <el-table-column label ="操作" align ="center" class-name ="small-padding fixed-width" > <template slot-scope ="scope" > <el-button size ="mini" type ="text" icon ="el-icon-check" @click ="handleTaskUpdate(scope.row)" v-hasPermi ="['teacher:task:edit']" > 更新</el-button > </template > </el-table-column > </el-table > </template > </el-table-column > <el-table-column label ="工作量" align ="center" prop ="workload" > <template slot-scope ="scope" > {{ getWorkload(scope.row) }} </template > </el-table-column > <el-table-column label ="操作" align ="center" class-name ="small-padding fixed-width" > <template slot-scope ="scope" > <el-button v-show ="scope.row.type > 0" size ="mini" type ="text" icon ="el-icon-edit" @click ="handleUpdate(scope.row)" v-hasPermi ="['teacher:workload:edit']" > 修改</el-button > <el-button size ="mini" type ="text" icon ="el-icon-delete" @click ="handleDelete(scope.row)" v-hasPermi ="['teacher:workload:remove']" > 删除</el-button > </template > </el-table-column > </el-table >
关键部分在
1 2 3 <template slot-scope ="scope" > <el-table :data ="scope.row.taskList" :stripe ="true" > ...
就是通过这个Element.Table
中这个scope
来确定范围,再通过scope.row
取得需要的数据即可
可以看一下下面的效果图
效果图
其实还是有点不满意的地方的,就是每个属性列都要展示一份独立的Table
表头
我目前也没找到好的方法把他提取出来,🤔🤔🤔
至此关于主要的分享已经结束了
补充
可能有人会注意到我上面的属性列表的输入框,那其实我做的一个类似于Excel
公式计算的东西
下面也分享一下,其实也很简单,可能我这还是笨方法呢😂😂😂
1 2 3 4 5 <el-table-column label ="单工作量" align ="center" prop ="workload" > <template slot-scope ="scope" > {{ getTaskWorkload(scope.row) }}</template > </el-table-column >
其实本质还是scope
定义好范围,计算就是了
把需要的方法写在methods
里即可,唯一我觉得需要注意的地方是,如果函数调用参数是另一个函数计算的,那么可能需要在最后的函数中再调用一次,如下
1 2 3 4 5 6 7 8 getWorkload (row ) { var y = parseFloat (0 ); for (var i in row.taskList ) { y += parseFloat (this .getTaskWorkload (row.taskList [i])); } return y.toFixed (3 ); },
总结
做毕设期间学到了不少,这种能获得的时候其实就是很幸福的
还有如果有错误的话,非常欢迎指正😁😁😁