ant-design-vue中table组件多列排序

news2025/4/8 16:43:35

antD中table组件多列排序

  • 使用前注意
  • 实现效果图
  • 实现的功能点及相关代码
    • 1. 默认按某几个字段排序
    • 2. 点击排序按钮可同时对多个字段进行排序
    • 3. 点击重置按钮可恢复默认排序状态。
  • 功能实现完整的关键代码

使用前注意

先要确认你使用的antD版本是否支持多列排序,我这里版本是3.2.15,使用的vue3 + ts。

实现效果图

在这里插入图片描述

实现的功能点及相关代码

1. 默认按某几个字段排序

在声明table列时指定需要默认排序的列属性sortOrder(ascend | descend)。 sorter 对象中的multiple字段用于指定多列排序时的优先级。数值越大,优先级越高。这意味着你可以通过为不同的列设置不同的 multiple值来实现多列排序,并且控制它们的排序优先级。

const columns = ref([
    {
        title: 'ID',
        dataIndex: 'id',
        sorter: {
            multiple: 1,
        },
    },
    {
        title: '设备名称',
        dataIndex: 'name',
        sortOrder: 'descend',
        sorter: {
            multiple: 2,
        },
    },
    {
        title: '产品名称',
        dataIndex: 'productName',
    },
    {
        title: '创建时间',
        dataIndex: 'createTime',
        scopedSlots: true,
        width: 200,
        sortOrder: 'descend',
        sorter: {
            multiple: 3,
        },
    },
    {
        title: '状态',
        dataIndex: 'state',
        scopedSlots: true,
    },
    {
        title: '说明',
        dataIndex: 'describe',
    },
    {
        title: '操作',
        dataIndex: 'action',
        fixed: 'right',
        width: 200,
        scopedSlots: true,
    },
]);

2. 点击排序按钮可同时对多个字段进行排序

table组件绑定的方法`@change="onChange"`


/**
 * onChange方法实现:
 * 处理的都是columns这个数据源
 * 首先判断是单列还是多列排序:
 * 1. 若是多列同时排序,sorter为Array,map处理数据结构后,拿到需要排序数据与table列[columns]匹配,匹配到的给当前列字段的排序状态赋值
 * 2. 若是单列排序,sorter为Object,直接对匹配到的列赋值。
 * change方法会触发table的查询方法(给接口传的参数在table的查询方法中处理)
 */
const onChange = (pagination, filters, sorter, extra) => {
    if (Object.prototype.toString.call(sorter) === '[object Array]') {
        let sorterData = sorter.map((item) => {
            return {
                field: item.field,
                order: item.order,
            };
        });

        columns.value.map((column) => {
            column.sortOrder = undefined;
            sorterData.find((item) => {
                if (item.field === column.dataIndex) {
                    column.sortOrder = item.order;
                }
            });
        });
    } else {
        columns.value.forEach((item) => {
            item.sortOrder = undefined;
            if (item.dataIndex === sorter.field) {
                item.sortOrder = sorter.order;
            }
        });
    }
};

3. 点击重置按钮可恢复默认排序状态。

/**
 * 1. 查询和重置调用一个方法,在重置emit触发该方法时多传一个参数resetFlag为true
 * 2. 重置时将排序字段修改为需要默认排序字段,方法resetSort
 */
const handleSearch = (_params: any) => {
    // 对要排序的数据组合为后端接口想要的格式[{name: "XXX", order: 'XXX'}]
    let sortsParams = columns.value
        .filter((item) => item.sortOrder)
        .map((item) => ({
            name: item.dataIndex,
            order:
                item.sortOrder === 'descend'
                    ? 'desc'
                    : item.sortOrder === 'ascend'
                    ? 'asc'
                    : '',
        }));

    params.value = {
        sorts: sortsParams,
    };
    if (_params?.resetFlag) {
        resetSort();
    }
};

/**
 * 重置方法
 * 重置时匹配需要重置的列,将当前列sortOrder属性置为需要默认排序值(我这里默认按创建时间和名称倒序)
 */
const resetSort = () => {
    columns.value.forEach((column) => {
        column.sortOrder = undefined; // 取消所有字段排序
        if (column.dataIndex === 'createTime' || column.dataIndex === 'name') {
            column.sortOrder = 'descend';
        }
    });
};

功能实现完整的关键代码

<template>
    <!-- 上面查询区-代码省略 -->
    <!-- wTable为封装的table组件 -->
    <wTable
        ref="wTableRef"
        :columns="columns"
        :request="query"
        :params="params"
        @change="onChange"
    >
        <!-- 中间省略一些插槽代码 -->
        <!-- 
            上面属性的简单介绍:
            columns:展示的table列
            request: 查询/查询时table数据请求的接口
            params: 查询条件参数与排序字段相关参数
         -->
    </wTable>
</template>
<script setup lang="ts" name="Instance">
import { query } from '@/api/XXX';
const params = ref<Record<string, any>>({});
const columns = ref([
    {
        title: 'ID',
        dataIndex: 'id',
        sorter: {
            multiple: 1,
        },
    },
    {
        title: '设备名称',
        dataIndex: 'name',
        sortOrder: 'descend',
        sorter: {
            multiple: 2,
        },
    },
    {
        title: '产品名称',
        dataIndex: 'productName',
    },
    {
        title: '创建时间',
        dataIndex: 'createTime',
        scopedSlots: true,
        width: 200,
        sortOrder: 'descend',
        sorter: {
            multiple: 3,
        },
    },
    {
        title: '状态',
        dataIndex: 'state',
        scopedSlots: true,
    },
    {
        title: '说明',
        dataIndex: 'describe',
    },
    {
        title: '操作',
        dataIndex: 'action',
        fixed: 'right',
        width: 200,
        scopedSlots: true,
    },
]);

const onChange = (pagination, filters, sorter, extra) => {
    if (Object.prototype.toString.call(sorter) === '[object Array]') {
        let sorterData = sorter.map((item) => {
            return {
                field: item.field,
                order: item.order,
            };
        });

        columns.value.map((column) => {
            column.sortOrder = undefined;
            sorterData.find((item) => {
                if (item.field === column.dataIndex) {
                    column.sortOrder = item.order;
                }
            });
        });
    } else {
        columns.value.forEach((item) => {
            item.sortOrder = undefined;
            if (item.dataIndex === sorter.field) {
                item.sortOrder = sorter.order;
            }
        });
    }
};

const handleSearch = (_params: any) => {
    let sortsParams = columns.value
        .filter((item) => item.sortOrder)
        .map((item) => ({
            name: item.dataIndex,
            order:
                item.sortOrder === 'descend'
                    ? 'desc'
                    : item.sortOrder === 'ascend'
                    ? 'asc'
                    : '',
        }));

    params.value = {
        sorts: sortsParams,
    };
    if (_params?.resetFlag) {
        resetSort();
    }
};

const resetSort = () => {
    columns.value.forEach((column) => {
        column.sortOrder = undefined; 
        if (column.dataIndex === 'createTime' || column.dataIndex === 'name') {
            column.sortOrder = 'descend';
        }
    });
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑

文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…

算法.图论-习题全集(Updating)

文章目录 本节设置的意义并查集篇并查集简介以及常见技巧并查集板子(洛谷)情侣牵手问题相似的字符串组岛屿数量(并查集做法)省份数量移除最多的同行或同列石头最大的人工岛找出知晓秘密的所有专家 建图及其拓扑排序篇链式前向星建图板子课程表 本节设置的意义 主要就是为了复习…

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度&#xff1a;…

Atomic原子操作类详解

Atomic原子操作类介绍 在并发编程中很容易出现并发安全的问题&#xff0c;有一个很简单的例子就是多线程更新变量i1,比如多个线程执行i操作&#xff0c;就有可能获取不到正确的值&#xff0c;而这个问题&#xff0c;最常用的方法是通过Synchronized进行控制来达到线程安全的目…

随手记: vue监听路由

随手记&#xff1a;没空记详细 newVal,oldVal 可以查看到最新路由和上一条路由详细 watch: {$route: {handler(newVal,oldVal) {console.log(newVal, oldVal)if(oldVal.path /organization/serviceManagement/list) {if(this.cacheId ! newVal.query.id) {this.cacheId newV…

AndroidStudio与开发板调试时连接失败或APP闪退的解决方案,涉及SELINUX及获取Root权限

现象 用AndroidStudio打开工程代码,点击运行后,报错: 解决方案 具体原因是尝试运行 su(通常用于获取超级用户权限)时失败了,提示 “Permission denied” 通过 CONFIG_SECURITY_SELINUX 变量控制 SElinux 开启或关闭 在vim /rk3568_android_sdk/device/rockchip/rk…

深度学习之One Stage目标检测算法2

我们将对单次目标检测器&#xff08;包括SSD系列和YOLO系列等算法&#xff09;进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率&#xff0c;特别是小目标的检测&#xff0c;其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet&#xff0c;看看…

Flutter通过 Coap发送组播

Flutter发送组播的流程 1.初始化 CoAP 客户端 需要初始化 CoAP 客户端并将其连接到组播地址和端口。您可以使用 CoAP 库提供的类来创建和配置客户端 final client CoapClient(Uri.parse(coap://224.0.1.1:5683), // 组播地址和端口 ); 2.创建 CoAP 请求 创建一个 CoAP 请…

使用Python3实现Gitee码云自动化发布

仓库信息 https://gitee.com/liumou_site/ip 实现代码 import osimport requests from loguru import loggerdef gitee(ver, message, prerelease: bool False):"""在 Gitee 上创建发布版本:param ver: 版本号:param message: 发布信息:param prerelease: 是…

【软考】系统架构设计师-2022年下半年上午综合知识真题及答案

​全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 高级 系统架构设计师 2022 年 下半年 上午试卷 综合知识 试题一 云计算服务体系结构如下图所示&#xff0c;图中①、②、③分别与⊆SaaSPaaSIaas 相对应&#xff0c; 图中①、②、③应为( ) A.⊆应用层、…

5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用

5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用 文章目录 5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用前言1. OpenFeign 介绍1.1 Feign 和 OpenFeign 区别 2. OpenFeign 应用实例2.2 注意事项和细节 3. OpenFeign 内置的“日志配置” 操…

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

指南: 如何在 MEV 项目中使用 Yul

这对我来说是一个反复出现的故事。我学习了一些 Solidity&#xff0c;发现了一个我想要研究的服务。代码看起来是这样的&#xff1a; Seaport Core: BasicOrderFulfiller.sol Solidity 代码在哪里&#xff1f;人们似乎不再使用普通的 Solidity 代码了 &#x1f972; 这种在智能…

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码&#xff0c; $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是&#xff1a;从 $file_name 中去除所有出现在 $deny_ext 数组中的元素&#xff0c;替换为空字符串&#xff08;即删除这些元素&#xff09;。str_ireplace() 在处理时…

北京申请中级职称流程(2024年)

想找个完整详细点的申请流程资料真不容易&#xff0c;做个分享送给需要的人吧。 不清楚为什么说文章过度宣传&#xff0c;把链接和页面去掉了&#xff0c;网上自己找一下。 最好用windows自带的EDGE浏览器打开申请网站&#xff0c;只有在开始申请的时间内才可以进行网上申报&…

Visual Studio 圈复杂度评估

VisualStudio自带的有工具 之后就可以看到分析结果

MySQL UPDATE语句执行链路解析

文章目录 引言1. 总览&#xff1a;UPDATE语句的执行链路2. 客户端发起请求2.1 SQL请求的形成2.2 MySQL通信协议 3. 连接器模块3.1 连接管3.2 会话上下文 4. SQL解析器4.1 语法解析4.2 语法错误处理 5. 查询优化器5.1 查询优化的核心概念5.2 优化器生成执行计划的步骤5.3 优化器…

.net6.0(.net Core)读取 appsettings.json 配置文件

① 新项目中创建名为 appsettings.json 的 json文件&#xff0c;内容为&#xff1a; {//数据库连接字符串:"ConnectionString": {"DBconn": "server127.0.0.1;databasedb;uidsa;pwd123456;Timeout600;EncryptTrue;TrustServerCertificateTrue;"…

[CISCN 2019初赛]Love Math 详细题解

知识点: 数学函数转换字符串 GET传参外部赋值 eval()函数解析执行命令 PHP动态调用函数名 源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (…

湛江市社保卡申领指南:手机获取电子照片回执单号

在湛江市&#xff0c;社保卡的申领流程已经实现了数字化&#xff0c;为市民带来了极大的便利。特别是通过手机获取数码照片回执单号&#xff0c;这一环节更是简化了申领过程。今天&#xff0c;我们将详细介绍如何不去照相馆&#xff0c;利用手机来获取数码照片回执单号&#xf…