vue3 el-table 列增加 自定义排序逻辑

在 Vue 3 中使用 Element Plus 的 <el-table> 组件时,如果你想增加自定义排序逻辑,可以通过以下几个步骤实现:

1. 使用 default-sort 属性

首先,你可以在 <el-table> 组件上使用 default-sort 属性来指定默认的排序规则。例如,如果你想默认按照某一列升序排序,可以这样做:

<template>
  <el-table :data="tableData" default-sort="{prop: 'date', order: 'ascending'}">
    <el-table-column prop="date" label="日期" sortable />
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="address" label="地址" />
  </el-table>
</template>

2. 使用 sort-method 或 sort-comparator 属性

对于自定义排序逻辑,你可以使用 sort-method 或 sort-comparator 属性。sort-method 适用于简单的比较函数,而 sort-comparator 适用于更复杂的排序逻辑,比如异步排序。

使用 sort-method
<template>
  <el-table :data="tableData">
    <el-table-column prop="date" label="日期" sortable :sort-method="dateSortMethod" />
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="address" label="地址" />
  </el-table>
</template>
 
<script setup>
import { ref } from 'vue';
 
const tableData = ref([...]); // 你的数据数组
 
const dateSortMethod = (a, b) => {
  return new Date(a) - new Date(b); // 示例:按日期字符串排序
};
</script>
使用 sort-comparator(适用于 Element Plus)
<template>
  <el-table :data="tableData">
    <el-table-column prop="date" label="日期" sortable :sort-comparator="dateComparator" />
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="address" label="地址" />
  </el-table>
</template>
 
<script setup>
import { ref } from 'vue';
 
const tableData = ref([...]); // 你的数据数组
 
const dateComparator = (a, b) => {
  return new Date(a.date) - new Date(b.date); // 按日期对象排序,确保数据对象中有 date 属性
};
</script>

3. 使用 sort-change 事件自定义排序行为(动态排序)

如果你需要在用户点击列头进行排序时执行更复杂的逻辑,可以使用 sort-change 事件。这个事件会在列头排序变化时触发,你可以在这个事件处理函数中实现自定义的排序逻辑。

<template>
  <el-table :data="tableData" @sort-change="handleSortChange">
    <el-table-column prop="date" label="日期" sortable />
    <el-table-column prop="name" label="姓名" />
    <el-table-column prop="address" label="地址" />
  </el-table>
</template>
 
<script setup>
import { ref } from 'vue';
 
const tableData = ref([...]); // 你的数据数组
const handleSortChange = ({ column, prop, order }) => {
  if (prop === 'date') {
    // 根据日期进行排序的自定义逻辑,例如使用 lodash 的 sortBy 或其他方法进行排序。
    // 这里仅作为示例,实际应根据需求调整排序逻辑。
    if (order === 'ascending') {
      tableData.value.sort((a, b) => new Date(a[prop]) - new Date(b[prop]));
    } else if (order === 'descending') {
      tableData.value.sort((a, b) => new Date(b[prop]) - new Date(a[prop]));
    } else { // order 为 null 表示取消排序,重置数据等逻辑可在此处理。
      // 重置数据或按其他逻辑处理。
    }
  }
};
</script>

### 实现 Vue3Element Plus 表格组件的行拖动排序 为了实现在 Vue3Element Plus 中 `el-table` 组件的行拖动排序功能,需遵循特定配置方法来启用此特性。HTML模板部分定义了表格结构及其基本属性,而JavaScript逻辑则负责处理交互行为。 #### HTML 模板定义 在 `<template>` 部分创建一个包含 `el-table` 的容器,并为其指定必要的属性: ```html <template> <div class="app-container"> <el-table :data="tableData" ref="dragTable" row-key="id" border style="width: 100%"> <!-- 定义表头 --> <el-table-column type="index" label="#" width="50"></el-table-column> <el-table-column prop="date" label="日期" sortable></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> <!-- 添加用于触发拖拽操作的特殊 --> <el-table-column fixed="right" label="操作" width="120"> <template #default="{row}"> <i class="el-icon-rank drag-handler" style="cursor: move;"></i> <!-- 使用图标作为手柄 --> </template> </el-table-column> </el-table> </div> </template> ``` 上述代码片段展示了如何构建带有额外操作栏的表格布局,其中包含了用于启动拖拽动作的手柄图标[^2]。 #### JavaScript 处理程序 接下来,在脚本区域引入依赖库并编写初始化函数以及事件处理器: ```javascript <script setup> import { ref, onMounted } from &#39;vue&#39;; import Sortable from &#39;sortablejs&#39;; // 导入Sortable.js插件 const tableData = ref([ { date: &#39;2016-05-03&#39;, name: &#39;Tom&#39;, address: &#39;No. 189, Grove St, Los Angeles&#39; }, ... ]); onMounted(() => { const el = document.querySelector(&#39;.el-table__body-wrapper tbody&#39;); new Sortable(el, { handle: &#39;.drag-handler&#39;, // 设置拖动手柄的选择器 animation: 150, ghostClass: "ghost", chosenClass: "chosen", onUpdate(event){ let oldIndex = event.oldIndex; let newIndex = event.newIndex; if (oldIndex !== undefined && newIndex !== undefined) { var movedItem = tableData.value.splice(oldIndex, 1)[0]; tableData.value.splice(newIndex, 0, movedItem); } } }); }); </script> ``` 这段脚本实现了当页面加载完成后自动激活拖放机制的功能,并通过监听更新事件调整内部状态数组中的顺序以反映界面上的变化[^3]。 #### CSS 样式定制 最后,可以通过自定义CSS样式进一步优化用户体验: ```css <style scoped> .drag-handler{ font-size: 20px; } .el-table .ghost td { background-color: lightblue !important; } .chosen { opacity: 0.7; } </style> ``` 这些样式规则增强了视觉反馈效果,使得正在被移动的行更加明显[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海天胜景

您的鼓励是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值