前端实现el-table多列排序

主要实现了el-table的多列排序,并在前端对数据进行排序。代码是四处复制的,仅供参考。

HTML:下面这三个是和排序有关的。

@sort-change="sortChange"
:header-cell-class-name="handleHeaderCellClass"

sortable="custom"
<el-table :data="showData"
                v-loading="loading"
                size="small"
                :row-key="tableData.xxx"
                border
                @sort-change="sortChange"
                :header-cell-class-name="handleHeaderCellClass"
                @header-dragend="headerDragend"
                style="width: 100%"
                height="100%">

        <el-table-column
          v-for="(item, index) in colList"
          :fixed="item.fixed"
          :key="`col_${index}`"
          :prop="item.prop"
          :label="item.label"
          :width="item.width"
          sortable="custom"
        >

JS:用到的两个方法

handleHeaderCellClass({row, column, rowIndex, columnIndex}) {
      this.orderArray.forEach((element) => {
        if (column.property === element.prop) {
          column.order = element.order;
        }
      });
    },
    sortChange({column, prop, order}) {
      //记录排序字段与排序方式,存入数组
      if (order) {
        //参与排序
        let flagIsHave = false;
        this.orderArray.forEach((element) => {
          if (element.prop === prop) {
            element.order = order;
            flagIsHave = true;
          }
        });
        if (!flagIsHave) {
          this.orderArray.push({
            prop: prop,
            order: order,
          });
        }
      } else {
        //不参与排序
        this.orderArray = this.orderArray.filter((element) => {
          return element.prop !== prop
        });
      }
      //要通过后端进行排序操作的话, 可以将this.orderArray传到后端
      console.log(this.orderArray);

      //处理前端要展示的数据,对数据进行排序
      this.currentPage = 1//回到第一页
      this.tableData.sort((a, b) => {
        const sortFun = (index) => {
          const currentSort = this.orderArray[index]
          // 如果当前相同,则递归向下排序
          if (a[currentSort.prop] === b[currentSort.prop]) {
            // 如果没有下级了,直接按照当前层级进行排序
            if (this.orderArray.length - 1 >= index + 1) {
              return sortFun(index + 1)
            }
          }
          // 根据排序规则进行排序
          if (currentSort.order === 'ascending') {
            if (a[currentSort.prop] > b[currentSort.prop]) {
              return 1
            } else {
              return -1
            }
          } else {
            if (a[currentSort.prop] > b[currentSort.prop]) {
              return -1
            } else {
              return 1
            }
          }
        }
        // 排序递归方法
        return sortFun(0)
      })
      //showData为要展示的数据,这里是通过前端分页的
      this.showData = this.tableData.slice(0, this.pageSize)

    },

最后的效果

                           

都是复制粘贴缝合出来的,有不对的地方多多见谅。

参考:

el-table多列同时排序且样式保留(多用于后台排序)

js实现多列排序

如何根据数组中每一项的某个非数字属性进行排序

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值