Antd中s-table组件某字段进行排序

news/2024/7/10 3:13:23 标签: vue, anti-design-vue, java

Antd中s-table组件某字段进行排序

提前说明,s-table组件包含分页等功能

	<s-table
			ref="table"
			:columns="columns"
			:data="loadData"
			bordered
			:row-key="(record) => record.id"
		>
	</s-table>

而其中loadData为获取表数据的方法,且每次获取时都会自动传递一些数据,如当前页等:

javascript">	const columns = [
		{
			title: '名称',
			dataIndex: 'name'
		}
	}
	// searchFormState中包含其他的查询条件字段
	let searchFormState = reactive({})
	const loadData = (parameter) => {
		// parameter为该组件传入的数据
		return xxxApi.jobPage(Object.assign(parameter, searchFormState)).then((data) => {
			return data
		})
	}

以下是当前示例的parameter数据:

{
    "current": 1,
    "size": 10
}

得到的parameter如图:parameter

sorter中进行比较

javascript">const columns = [
  {
    title: '新用户数',
    dataIndex: 'newUser',
    sorter: {compare: (a, b) => a.newUser - b.newUser},
    align: 'center'
  },
  {
    title: '充值金额',
    dataIndex: 'payFee',
    sorter: {compare: (a, b) => a.payFee - b.payFee},
    align: 'center'
  }
}

后端不需要改变,但是这样的话,顺序如下:
现有一组数据:0.88、2.00、3.00、4.00、5.00、6.00、1.88、6.00、8.00、8.00、9.00、7.00;分页:每页10条
默认情况下:
第一页:0.88、2.00、3.00、4.00、5.00、6.00、1.88、6.00、8.00、8.00;
第二页:9.00、7.00;
点击升序:
第一页:2.00、3.00、4.00、5.00、6.00、6.00、7.00、8.00、8.00、9.00;
第二页:0.88、1.88;
点击降序:
第一页:9.00、8.00、8.00、7.00、6.00、6.00、5.00、4.00、3.00、2.00;
第二页:1.88、0.88;
即它会将所有数据按照降序排列,之后进行分页,对每一页再进行升序降序排列;尝试了sorter: {compare: (a, b) => b.payFee - a.payFee},得到的结果依旧如此。

开启sorter传入后端查询

在新增columns中每列属性中加入sorter: true;

javascript">const columns = [
  {
    title: '新用户数',
    dataIndex: 'newUser',
    sorter: true,
    align: 'center'
  },
  {
    title: '充值金额',
    dataIndex: 'payFee',
    sorter: true,
    align: 'center'
  }
}

如果点击这两列进行排序(前提是点击了这两列进行升序/降序,不然不会传入数据)const loadData = (parameter) => {}中得到的parameter还包含了sortFieldsortOrder,当前点击充值金额列得到的parameter如下:

{
    "current": 1,
    "size": 10,
    "sortField": "payFee",
    "sortOrder": "ascend",
}
{
    "current": 1,
    "size": 10,
    "sortField": "payFee",
    "sortOrder": "descend",
}

则此时后端也需要接收这两个字段,如下:

java">    // 排序字段
    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:payFee")
    private String sortField;

    // 排序方式
    @ApiModelProperty(value = "排序方式,升序:ascend;降序:descend")
    private String sortOrder;

此时查询逻辑如下:

java">        if(ObjectUtil.isAllNotEmpty(param.getSortField(), param.getSortOrder())) {
        	// 当前排序字段是否合法
            CommonSortOrderEnum.validate(param.getSortOrder());
            // 根据sortField参数字段payFee进行排序
            // 解释:orderBy(boolean condition, boolean isAsc, R column)
            queryWrapper.orderBy(true, param.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
                    StrUtil.toUnderlineCase(param.getSortField()));
        } else {
        	// 否则按创建时间升序
            queryWrapper.lambda().orderByAsc(TableEntity::getCreateTime);
        }

通用排序方式枚举类如下(注意,因为前端传入的是小写的,所以此处也用小写的):

java">@Getter
public enum CommonSortOrderEnum {

    /** 升序 */
    ASC("ascend"),

    /** 降序 */
    DESC("descend");

    private final String value;

    CommonSortOrderEnum(String value) {
        this.value = value;
    }

    public static void validate(String value) {
        boolean flag = ASC.getValue().equals(value) || DESC.getValue().equals(value);
        // 如果上述是大写,则需要加入toLowerCase()方法将字段转换为小写
        // boolean flag = ASC.getValue().toLowerCase().equals(value) || DESC.getValue().toLowerCase().equals(value);
        // 但是同时在逻辑中不能再使用:param.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue())
        // 要修改为param.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue().toLowerCase())
        if(!flag) {
            throw new CommonException("不支持该排序方式:{}", value);
        }
    }
}

此时查询出来结果与第一个方法不一致,此时不会先倒序排列再分页排序,该方法直接是在数据库中将所有数据按照sortOrder字段进行排序,之后再分页!!!
所以结果如下:
升序:
第一页:0.88、1.88、2.00、3.00、4.00、5.00、6.00、6.00、7.00、8.00;
第二页:8.00、9.00;
降序:
第一页:9.00、8.00、8.00、7.00、6.00、6.00、5.00、4.00、3.00、2.00;
第二页:1.88、0.88;


http://www.niftyadmin.cn/n/5425903.html

相关文章

Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-mEkKUraSFHLKkzIj {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Batch Nomalization 迁移学习

Batch Nomalization 1.Batch Nomalization原理 图像预处理过程中通常会对图像进行标准化处理&#xff0c;这样能够加速网络的收敛。就是按照channel去求均值和方差&#xff0c;然后原数据减均值除标准差&#xff0c;使我们的feature map满足均值为0&#xff0c;方差为1的分布…

vscode 之 vue项目如何使用ctrl+鼠标左键跳转对应文件

话不多说&#xff0c;直接步入正题 使用项目工程的jsconfig.json 直接在项目中使用jsconfig.json/tsconfig.json文件配置&#xff08;项目中没有相应的文件的添加文件&#xff0c;有文件的添加"paths": {"/*": ["./src/*"]}配置即可&#xff0…

2.2 评估方法 机器学习

我们若有一个包含m个样例的数据集&#xff0c;若我们既需要训练&#xff0c;也需要测试&#xff0c;我们该如何处理呢&#xff1f;下面是几种方法&#xff1a; 2.2.1 留出法 “留出法”直接将数据集D划分为两个互斥的集合&#xff0c;其中一个作为训练集S&#xff0c;另一个作…

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…

使用Vue3写一个抽屉Drawer组件

一、创建抽屉组件的基本结构 <view class"drawer-container"><view class"mask-container"></view><view class"content-container"><slot></slot></view> </view>二、定义遮罩层、内容区域的…

RPC基础知识回顾

RPC基础知识回顾 1、先认识一下大家熟悉的HTTP 大家都了解HTTP吧。相信项目中也用过一些。 比如: JDK自带的老旧的HttpURLConnection&#xff0c;封装写的很累,java8之前基于HTTP1.0。在java9开始支持Http2.0Spring的其中RestTemplate都是基于HTTP/1.1的请求。最新的还有Sp…

sql设置插入之前进行判断,是否数据重复,出现过则不添加

在SQL中&#xff0c;可以使用INSERT IGNORE语句来实现在插入数据之前进行判断&#xff0c;如果数据已经存在则不会添加。 假设有以下表结构&#xff1a; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQ…