el-tabel名称排序问题

el-tabel排序

最终实现功能如下:

排序限制为:
文件夹>普通文件
数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z)

正序

在这里插入图片描述

倒序

在这里插入图片描述

代码如下:

<template>
  <div class="personalFiles containerBox">
    <div class="personalFileCont">
      <el-table
        v-loading="loading"
        :data="tabelList"
        row-key="uuid"
        ref="tableRef"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column
          label="文件名"
          min-width="250"
          sortable
          :sort-method="sortName"
        >
          <template slot-scope="scope">
            <span
              class="cursor-pointer"
            >
              <img
                :src="getIcon(scope.row.name, scope.row.uuid, scope.row.dir)"
                alt=""
                class="tabelImg"
              />
              <span
                class="fileNameCont ellipsis"
                :class="isCollapse ? 'detailFileName' : ''"
                >{{ scope.row.name }}</span
              >
            </span>
          </template>
        </el-table-column>
        <el-table-column label="最后修改人">xxx</el-table-column>
        <el-table-column
          label="大小"
          sortable
          prop="size"
          :default-sort="{ prop: 'size', order: 'descending' }"
        >
          <template slot-scope="scope">
            {{ humanFileSize(scope.row.size) }}
          </template>
        </el-table-column>
        <el-table-column
          label="修改时间"
          prop="updateTime"
          sortable
          :default-sort="{ prop: 'updateTime', order: 'descending' }"
        ></el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script>
import {
  getMatterPage,
} from "@/api/personalFiles";
import { humanFileSize, isImage } from "@/utils/FileUtil";
import { getIcon } from "@/utils/Matter.js";
import { getChartType } from "@/utils/index";
export default {
  name: "spaceDetailList",
  props: {
    curSpaceObj: {
      type: Object,
      default: () => {}
    }
  },
  data() {
    return {
      queryParams: {
        page: 1,
        pageSize: 10,
        puuid: "root",
        deleted: false,
        orderDir: "DESC",
        orderName: "ASC",
        spaceUuid: '',
      },
      total: 0,
      loading: false,
      tabelList: [],
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.queryParams.spaceUuid = this.curSpaceObj.uuid
      this.getList();
    })
  },
  methods: {
    humanFileSize,
    getIcon,
    isImage,
    getList() {
      this.loading = true;
      getMatterPage({ ...this.queryParams })
        .then((res) => {
          this.tabelList = res.data.data;
          this.total = res.data.totalItems;
        })
        .finally(() => {
          this.loading = false;
        });
    },
    // 排序
    sortName(str1, str2) {
      let strName1 = str1.name;
      let strName2 = str2.name;
      let res = 0;
      for (let i = 0; ; i++) {
        if (!strName1[i] || !strName2[i]) {
          res = strName1.length - strName2.length;
          break;
        }
        // 此处判断文件类型 dir-true代表是文件夹
        if (str1.dir != str2.dir) {
          res = 1;
          break;
        }
        const char1 = strName1[i];
        const char1Type = getChartType(char1);
        const char2 = strName2[i];
        const char2Type = getChartType(char2);
        // 类型相同的逐个比较字符
        if (char1Type[0] === char2Type[0]) {
          if (char1 === char2) {
            continue;
          } else {
            if (char1Type[0] === "zh") {
              res = char1.localeCompare(char2);
            } else if (char1Type[0] === "en") {
              res = char1.charCodeAt(0) - char2.charCodeAt(0);
            } else {
              res = char1 - char2;
            }
            break;
          }
        } else {
          // 类型不同的,直接用返回的数字相减
          res = char1Type[1] - char2Type[1];
          break;
        }
      }
      return res;
    },
  },
};
</script>
<style lang="scss" scoped>
@import url('@/assets/styles/personalFiles.scss');
</style>
排序使用到的getChartType方法,代码中用到图片和字节转换方法跟当前功能无关就不展示了
// 排序
export function getChartType(char) {
  // 数字(0->9)->大写字母(A->Z)->小写字母(a->z)->中文拼音(a->z)
  if (/^[\u4e00-\u9fa5]$/.test(char)) {
    return ["zh", 300];
  }
  if (/^[a-zA-Z]$/.test(char)) {
    return ["en", 200];
  }
  if (/^[0-9]$/.test(char)) {
    return ["number", 100];
  }
  return ["others", 999];
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue的el-table组件提供了数据排序的功能,可以通过设置column的sortable属性来开启排序功能。当用户点击表头时,会触发表格的排序事件,此时可以获取到当前排序的列和排序的方式(升序或降序),可以将这些信息发送给后台,后台再根据这些信息返回排序过后的数据。 具体实现可以参考以下步骤: 1. 在el-table-column中设置sortable属性为true,表示该列可以排序。 2. 监听el-table的sort-change事件,获取当前排序的列和排序的方式。 3. 将获取到的排序信息发送给后台,后台根据这些信息返回排序过后的数据。 4. 将返回的数据更新到el-table中,即可实现数据排序。 举个例子,假设我们有一个学生选课系统,使用Vue的el-table组件展示选课记录,我们可以按照选课时间、课程名称等字段进行排序。具体实现可以参考以下代码: ``` <template> <el-table :data="tableData" @sort-change="handleSortChange"> <el-table-column prop="courseName" label="课程名称" sortable></el-table-column> <el-table-column prop="selectTime" label="选课时间" sortable></el-table-column> <el-table-column prop="teacherName" label="授课教师"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [] } }, methods: { handleSortChange({ column, prop, order }) { // 发送排序信息给后台 this.$axios.post('/api/sort', { column, prop, order }).then(res => { // 更新表格数据 this.tableData = res.data }) } } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值