Element 的Table表格实现列合并(记得先排序、element-plus、列合并、线上已投入使用)

系列文章目录

提示:当前的功能已经投入项目中使用了,不要担心回发生什么问题!!!代码有问题直接私信我就好👌



背景如下

需求是
1、服务与不同的船公司,分别有进出口的分类
2、希望对相同业务,价格,进行列合并
3.、一句话:合并前几列相同的列,只要数据相同就可以合并


提示:以下是本篇文章正文内容,下面案例可供参考

一、Element-Plus 中Table表格的列合并(初版)

1.效果图如下

在这里插入图片描述

2. DOM结构 如下

 <div>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%; margin-top: 20px"
    >
      <el-table-column prop="id" label="ID" width="180" />
      <el-table-column prop="name" label="Name" />
      <el-table-column prop="amount1" label="Amount 1" />
      <el-table-column prop="amount2" label="Amount 2" />
      <el-table-column prop="amount3" label="Amount 3" />
    </el-table>
  </div>

3.TypeScript代码如下

interface User {
  id: string
  name: string
  amount1: string
  amount2: string
  amount3: number
}

interface SpanMethodProps {
  row: User
  column: TableColumnCtx<User>
  rowIndex: number
  columnIndex: number
}

const values =ref("")
const value1 =reactive({})
const objectSpanMethod = ({
  row,
  column,
  rowIndex,
  columnIndex,
}: SpanMethodProps) => {

     if(columnIndex == 0){
     
      let spanCount = 1;

        // 从当前行往下找
        for (let i = rowIndex + 1 ; i < tableData.length; i++) {
          if (tableData[i][column.property] === row[column.property]) {
            spanCount++;
            values.value =  row[column.property]
          } else {
            break;
          }
        }
          if(spanCount === 1 && !value1[`${values.value}`])   return [1,1]
          !value1[`${values.value}`] && (value1[`${values.value}`] = spanCount)
      
         if(spanCount>(value1[`${values.value}`]-1)){
              return [spanCount,1]
          }else if (rowIndex > 0 &&tableData[rowIndex - 1][column.property] === row[column.property]) {

          return [0, 0];
        }
       
        
    }
}

二、Element-Plus 中Table表格的列合并(进阶版)

1.效果图如下

在这里插入图片描述

2. DOM结构 如下


  <div>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%; margin-top: 20px"
    >
      <el-table-column prop="id" label="ID" width="180" />
      <el-table-column prop="name" label="Name" />
      <el-table-column prop="amount1" label="Amount 1" />
      <el-table-column prop="amount2" label="Amount 2" />
      <el-table-column prop="amount3" label="Amount 3" />
    </el-table>
  </div>

3. TypeScript代码如下


interface User {
  id: string
  name: string
  amount1: string
  amount2: string
  amount3: number
}

interface SpanMethodProps {
  row: User
  column: TableColumnCtx<User>
  rowIndex: number
  columnIndex: number
}

const values =ref("")
let str = ""
const value1 =reactive({})
const objectSpanMethod = ({
  row,
  column,
  rowIndex,
  columnIndex,
}: SpanMethodProps) => {

     if(columnIndex == 0 || columnIndex == 1){
     
      let spanCount = 1;

        // 从当前行往下找
        for (let i = rowIndex + 1 ; i < tableData.length; i++) {
          if (tableData[i][column.property] === row[column.property]) {
            spanCount++;
            str =  row[column.property]
          } else {
            break;
          }
        }
                console.log(rowIndex,9999,spanCount === 1 && !value1[`${str}`])
          if(spanCount === 1 && !value1[`${str}`])   return [1,1]
          !value1[`${str}`] && (value1[`${str}`] = spanCount)
      
         if(spanCount>(value1[`${str}`]-1)){
          console.log(rowIndex,`行 -${value1[`${str}`]}`,columnIndex,"列-相同值",spanCount,value1,"执行次数--值",str)
              return [spanCount,1]
}else if (rowIndex > 0 &&tableData[rowIndex - 1][column.property] === row[column.property]) {
  console.log("",tableData[rowIndex - 1][column.property],row[column.property])
          return [0, 0];
        }
       
        
    }
}

二、Element-Plus 中Table表格的列合并(最终优化版)

1. TypeScript代码如下

/* 下面的方法(脑力精髓-简洁-代码量极少)*/
interface TableKeyTypes {
    eximType: string
    dndFeeType: string
    period: string
    "20GP": string
    "40GP": string
    "40HQ": string
    currency: string
    [key: string]: string;
}

interface SpanMethodProps {
    row: TableKeyTypes
    column: Record<"property", keyof TableKeyTypes>
    rowIndex: number
    columnIndex: number
}
// prohibit modify to ref (超负载)
let str = ""
const stroageValue:Record<string, string|number> = reactive({})
// colspan all from the same value
const colSpanMethod = ({
    row,
    column,
    rowIndex,
    columnIndex
}: SpanMethodProps) => {

    if (columnIndex == 0 || columnIndex == 1) {
        let spanCount = 1
        // 从当前行往下找
        for (let i = rowIndex + 1; i < colSpanTableData.value.length; i++) {
            if (colSpanTableData.value[i][`${column.property}`] === row[`${column.property}`]) {
                spanCount++
                str = row[`${column.property}`]
            } else {
                break
            }
        }
        if (spanCount === 1 && !stroageValue[`${str}`]) return [1, 1]
        !stroageValue[`${str}`] && (stroageValue[`${str}`] = spanCount)
        if (spanCount > ((stroageValue[`${str}`] as number) - 1)) {
            return [spanCount, 1]
        } else if (rowIndex > 0 && colSpanTableData.value[rowIndex - 1][`${column.property}`] === row[`${column.property}`]) {
            return [0, 0]
        }
    }
}

总结

提示:直接拿去Element-Plus去测试代码。已经上线过的功能,

希望可以帮助到你们 💪💪💪,一起加油

在Vue、Vite和Element Plus项目中,实现Table表格中的某一全数据排序通常涉及到以下几个步骤: 1. 首,你需要在你的Vue组件中引入`element-plus`的Table组件,并设置初始的数据源。例如,你可以有一个数组 `dataList` 存储表格的所有数据。 ```html <template> <el-table :data="dataList"> <!-- 表头配置 --> <el-table-column label="标题" prop="yourColumnToSort" sortable></el-table-column> <!-- 其他... --> </el-table> </template> <script> import { defineComponent, ref } from 'vue'; import { Table, TableColumn } from 'element-plus'; export default defineComponent({ components: { Table, TableColumn, }, data() { return { dataList: [], // 根据实际数据填充 }; }, }); </script> ``` 2. 然后,在`methods`中创建一个方法来处理排序功能,例如你可以使用JavaScript的sort方法对数组进行排序,传入自定义比较函数。这里我们假设你想按照 "yourColumnToSort" 进行升序排。 ```javascript <script> ... methods: { sortData(column) { this.dataList.sort((a, b) => a[column.key] - b[column.key]); // 降序则使用 > 操作符 }, }, mounted() { // 初始化排序 const yourColumn = this.$refs.table.columns.find((col) => col.prop === 'yourColumnToSort'); if (yourColumn && yourColumn.sortable) { this.sortData(yourColumn); } } // ... </script> ``` 3. 当用户点击表头的排序图标时,可以监听Table的`sort-method`事件并调用自定义的排序方法。 ```html <template> ... <el-table-column label="标题" prop="yourColumnToSort" sortable @sort-method="sortData" ></el-table-column> ... </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满脑子技术的前端工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值