当前位置:   article > 正文

vue + Element Ui 中生成动态合并表格及后端数据说明及常见问题_elementui动态生成表格

elementui动态生成表格

一、首先按需求举个例子:

在利用vue的一些框架开发中(比如ruoyi),有时会遇见这样需要一对多对多显示的表格(如下图),按照相同项合并多余的行。看到这如果和你遇见的问题相似那就步入正题

二、前端的设计

  1. <h2>动态合并表格<h2>
  2. <el-table
  3. :data="tableData"
  4. style="width: 100%"
  5. :span-method="objectSpanMethod"
  6. border
  7. >
  8. <!--遍历表-->
  9. <el-table-column
  10. :prop="item.prop"
  11. :label="item.label"
  12. v-for="(item, index) in tableHeader"<!--按设定的表头-->
  13. :key="index"
  14. ></el-table-column>
  15. </el-table>
  16. </el-dialog>

讲解中不以具体某些数据举例,统一用tableDatap[]数据对象数组表示需要遍历的数据

  1. <script>
  2. export default {
  3. name: "MultiRowMergeTable",
  4. data() {
  5. this.spanMap = {};
  6. this.mergedColumns = ["examineName","examineProject"]
  7. return {
  8. tableHeader: [
  9. {
  10. prop: "examineName",
  11. label: "检查表",
  12. },
  13. {
  14. prop: "examineProject",
  15. label: "检查项目",
  16. },
  17. {
  18. prop: "examineWord",
  19. label: "检查内容",
  20. },
  21. {
  22. prop: "remark",
  23. label: "备注",
  24. }
  25. ],
  26. tableData: []
  27. }
  28. },
  29. created() {
  30. this.getList();//进入页面时调用getList()获取tableData[]数据
  31. },
  32. methods: {
  33. //具体获取数据方法因需求而异
  34. getList() {
  35. listExamineTableData(this.queryParams).then(response => {
  36. this.tableData = response.data;
  37. this.getSpanArr(this.tableData);
  38. });
  39. },
  40. getSpanArr(data) {
  41. for (var i = 0; i < data.length; i++) {
  42. if (i === 0) {
  43. this.mergedColumns.forEach(column => {
  44. this.spanMap[column] = {
  45. spanArr: [1],
  46. pos: 0
  47. }
  48. })
  49. } else {
  50. this.mergedColumns.forEach(column => {
  51. if (data[i][column] === data[i - 1][column]) {
  52. this.spanMap[column].spanArr[this.spanMap[column].pos] += 1;
  53. this.spanMap[column].spanArr.push(0)
  54. } else {
  55. this.spanMap[column].spanArr.push(1);
  56. this.spanMap[column].pos = i;
  57. }
  58. })
  59. }
  60. }
  61. },
  62. objectSpanMethod({ column, rowIndex }) {
  63. if (this.spanMap[column.property]) {
  64. const _row = this.spanMap[column.property].spanArr[rowIndex];
  65. const _col = _row > 0 ? 1 : 0;
  66. return {
  67. rowspan: _row,
  68. colspan: _col
  69. }
  70. }
  71. }
  72. }
  73. }
  74. </script>

到这里前端的开发就已经完成了,只要getSpanArr(data) 和objectSpanMethod({ column, rowIndex })方法正常无错的带入就不会有太大问题。

三、后端数据说明及常见问题

后端代码就正常编写Controller类,Service类,Mapper类

常见并经常忽略Bug的来了

数据库以下列形式表示时

前端会显示为:

原因就是前端合并单元格的方法中只合并连续相同的数据行 ,由于数据添加顺序、时间等因素不同的影响无法保证相同连续。

所以我们在查询数据库的时候需要运用SQL语句中的自定义排序查询,运用自定义排序就需要新建一个与之对应的数据字典。如下简单的一个表project_dict

在对应的mybatis配置文件Mapper.xml中写以下查询语句

  1. <select id="selectExamineProjectNotNullList" parameterType="String" resultMap="SysExamineProjectResult">
  2. select *
  3. from sys_examine_project
  4. inner join project_dict p on p.examine_project = sys_examine_project.examine_project
  5. and sys_examine_project.examine_name = #{examineName}
  6. order by p.id
  7. </select>

其他and的条件因人而异但是这句连接数据字典的条件一定要有

inner  join project_dict p on p.examine_project = sys_examine_project.examine_project

查询结果如下:

综上,就可以得到一个心怡的依靠动态数据合并单元格表格了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/233009
推荐阅读
相关标签
  

闽ICP备14008679号