前端数据处理 , 数据排序 , table 数据整理 ,el-table根据数据动态合并单元格

最近被一个小小的前端数据处理脑子整的有点糊了,就是在大脑里整个的思路很简单,但是写完代码一跑确有问题,顿时陷入了思路和代码实现的对抗,改来改去最终是我总结的是对嵌套的for 循环不仔细分析是很容易出问题的。记录一下脑子糊了之后走不动的感受,教训是要慢下来,对自己的每一部分代码进行思路对应的检查。

第一版需求:

Select 病种选择,选择的数据在table 中进行展示,一类病种只能选择同一个医院,因此选择后的同类病种要放在一行中,数据展示按照选择的顺序展示,每一个病种可以单独删除。最终的效果图如下

实现思路,选择框选择的病种会选择到一个集合中,根据选择的集合,根据病种分类整理适合table 展示的数据,监听select控件的change时间,实现选择数据和下方table 的联动。每次change 都会按照当前的选择重新整合table 数据。

以上思路增加选择项的时候确实没有问题,按照选择的顺序 逆序删除也没有问题,但是选择框中的数据是按照选择顺序加入的,但是同类病种如果最先加入的被删除,change 时间触发后再整理table 数据,会导致table 原有数据上下行的交替,这种效果显然不符合正常的显示逻辑。

解决思路:

在整理table 数据之前,首先要把table 中已有的数据放在最前面,之后把新增的数据放在后面,再按照顺序整理table 数据

具体代码如下:

<template>
  <div class="containerbox">
    <el-select
      v-model="selectedDiseases"
      @change="changeDisease"
      value-key="diseaseNo"
      multiple
      collapse-tags
      style="margin-left: 20px;"
      placeholder="请选择申请病重"
      :multiple-limit="8"
      popper-class="sort_select"
    >
      <el-option v-for="item in allDisease" :key="item.diseaseNo" :label="item.diseaseName" :value="item"> </el-option>
    </el-select>

    <el-table :data="tableData" style="width: 100%" border center>
      <el-table-column label="选择申请病种" :min-width="180" align="center">
        <template slot-scope="scope">
          <!--  -->
          <span class="diseaseItem" v-for="item in scope.row.itemInfo" :key="item.diseaseNo"
            >{
  
  { item.diseaseName }}
            <el-button type="text" class="el-icon-remove-outline" @click="removeDisease(item)"></el-button>
          </span>
        </template>
      </el-table-column>
      <el-table-column prop="fixhospitalName" label="选择医院" :min-width="180" align="center"> </el-table-column>
      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button type="primary" @click="chooseHospital(scope.row)">请选择医院</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
import diseaseData from './disease.json'
export default {
  data() {
    return {
      tableData: [],
      allDisease: [],
      selectedDiseases: [],
      diseasesDto: []
    }
  },
  methods: {
    change
在使用 `el-table` 合并单元时,数据处理方法通常涉及编写合逻辑函数在 `el-table` 中使用该函数。以下是具体介绍: ### 定义合逻辑函数 通常会定义一个如 `objectSpanMethod` 的函数来处理合逻辑。该函数接收一个包含行、列、行索引和列索引等信息的对象作为参数。在函数内部,根据具体的业务需求编写合规则。例如,若要根据某些字段相同来合行,可遍历数据记录相同字段的起始行和结束行,进而确定合的行数。 ### 在 `el-table` 中使用合逻辑函数 在 `el-table` 组件中,通过 `:span-method` 属性绑定定义好的合逻辑函数。例如,使用 `:span-method="((A:any) => objectSpanMethod({ A }, [0, 5])) as any"` 来指定合逻辑函数,根据需要传入额外参数,像指定要合的列范围等 [^1]。 ### 示例代码 以下是一个简单的示例代码,展示了如何处理 `el-table` 合并单元数据: ```vue <template> <div class="table"> <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%"> <el-table-column prop="index" type="index" label="序号"></el-table-column> <el-table-column prop="time" label="时间"></el-table-column> <el-table-column prop="grade" label="年级"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="subjects" label="科目"></el-table-column> <el-table-column prop="score" label="成绩"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ { time: '2024-01-01', grade: '一年级', name: '张三', subjects: '数学', score: 90 }, { time: '2024-01-01', grade: '一年级', name: '李四', subjects: '语文', score: 85 }, { time: '2024-01-02', grade: '二年级', name: '王五', subjects: '英语', score: 92 } ] }; }, methods: { objectSpanMethod({ row, column, rowIndex, columnIndex }) { // 这里编写具体的合逻辑 if (columnIndex === 1) { // 示例:根据时间列合行 if (rowIndex > 0 && this.tableData[rowIndex].time === this.tableData[rowIndex - 1].time) { return { rowspan: 0, colspan: 0 }; } let rowspan = 1; for (let i = rowIndex + 1; i < this.tableData.length; i++) { if (this.tableData[i].time === this.tableData[rowIndex].time) { rowspan++; } else { break; } } return { rowspan: rowspan, colspan: 1 }; } return { rowspan: 1, colspan: 1 }; } } }; </script> ``` 在上述代码中,`objectSpanMethod` 函数根据时间列的值来决定是否合行。如果当前行的时间与上一行相同,则将当前行的 `rowspan` 设置为 0,表示不显示该单元;若不同,则计算相同时间的行数作为 `rowspan`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值