element ui 之 el-table 的多列排序,带清除排序

话不多说,直接上代码。 

 1、html

<template>
  <!--el-table 标签中增加 handleSortChange 和 handleHeaderCellClass 方法-->
  <!--el-table-column 标签中增加 sortable='custom'-->
  <el-table
    @sort-change="handleSortChange"
    :header-cell-class-name="handleHeaderCellClass"
  >
    <el-table-column prop="XXX" :label="XXX" sortable="custom">
    </el-table-column>
    <el-table-column prop="XXX" :label="XXX" sortable="custom">
    </el-table-column>
    <el-table-column prop="XXX" :label="XXX" sortable="custom">
    </el-table-column>
  </el-table>
</template>

 

2、JavaScript

<script>
export default {
  data() {
    return {
      // 定义一个数组,用来存放排序字段
      orderArray: [],
    };
  },
  methods: {
    // 清除排序
    resetQuery() {
      // 因为无法通过element ui的api来清除排序样式,所以只能通过原生js来清除
      this.$refs.table.$el.querySelectorAll(".is-sortable").forEach((item) => {
        // 移除table表头中的排序样式descending和ascending
        item.classList.remove("descending");
        item.classList.remove("ascending");
      });
      // 同时要清除排序字段
      this.sortArray = [];
    },

    // 保留所有排序过的箭头样式
    handleHeaderCellClass({ row, column, rowIndex, columnIndex }) {
      const sortArray = this.sortArray;
      for (let i = 0; i < sortArray.length; i++) {
        if (column.property === sortArray[i].prop) {
          column.order = sortArray[i].order;
        }
      }
    },


    // 收集排序字段,并发送后端
    // 根据点击排序箭头的状态(即order),添加或删除排序字段
    handleSortChange({ column, prop, order }) {
      const sortArray = this.sortArray;
      if (order) {
        // 参与排序
        let flagIsHave = false;
        for (let i = 0; i < sortArray.length; i++) {
          if (sortArray[i].prop === prop) {
            sortArray[i].order = order;
            flagIsHave = true;
          }
        }
        if (!flagIsHave) {
          sortArray.push({
            prop: prop,
            order: order,
          });
        }
      } else {
        // 不参与排序
        let orderIndex = 0;
        for (let i = 0; i < sortArray.length; i++) {
          if (sortArray[i].prop === prop) {
            orderIndex = i;
          }
        }
        sortArray.splice(orderIndex, 1);
      }
      // console.log(sortArray, "sortArray000");

      // 转成json字符串发送到后端
      this.queryParams.sortJson = JSON.stringify(sortArray);
      this.handleQuery();
    },
  },
};
</script>

 发送到后端的json字符串样式,ascending是升序,descending是降序,如下:

sortJson = [
    {
        "prop": "wifiLinkCount",
        "order": "ascending"
    },
    {
        "prop": "activeLinkCount",
        "order": "ascending"
    },
    {
        "prop": "memPercent",
        "order": "ascending"
    },
    {
        "prop": "cpuPercent",
        "order": "descending"
    },
    {
    	"prop": "modelTemp",
        "order": "ascending"
    },
    {
        "prop": "onlineTimesStr",
        "order": "ascending"
    },
    {
        "prop": "offlineTime",
        "order": "descending"
    }
]

总结

每次点击排序箭头时,都会触发 handleSortChange 事件,该事件方法内会收集或排除排序字段,然后根据收集的排序字段向后端请求数据。

在触发执行 handleSortChange 完事件后,会执行 handleHeaderCellClass 方法,该方法的作用是保留所有字段排序状态,element ui自带的表格排序是没有这个功能的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值