在Ant-Design
中使用Table
组件实现多列排序,怎么实现自定义排序(默认排序顺序是升序->降序->取消排序)。以及只能通过点击上下箭头进行排序,而不是点击列头进行排序。实现效果类似Element-UI
中Table
组件的列排序的交互。
通过提供对应的API,没能实现这样的功能。
在Ant-Design
中使用Table
组件实现多列排序,怎么实现自定义排序(默认排序顺序是升序->降序->取消排序)。以及只能通过点击上下箭头进行排序,而不是点击列头进行排序。实现效果类似Element-UI
中Table
组件的列排序的交互。
通过提供对应的API,没能实现这样的功能。
import React, { useState } from 'react';
import { Table } from 'antd';
import { CaretUpOutlined, CaretDownOutlined } from '@ant-design/icons';
const CustomSortTable = () => {
const [dataSource, setDataSource] = useState([
{ id: 1, name: 'John', age: 32, score: 85 },
{ id: 2, name: 'Jim', age: 28, score: 92 },
{ id: 3, name: 'Tom', age: 35, score: 78 },
]);
const [sortConfig, setSortConfig] = useState({
columnKey: null,
order: null
});
const handleSort = (columnKey) => {
setSortConfig(prevConfig => {
// 根据当前排序状态决定下一个排序状态
if (prevConfig.columnKey !== columnKey) {
// 如果是新的列,首先升序排序
return { columnKey, order: 'ascend' };
} else if (prevConfig.order === 'ascend') {
// 如果已经是升序,则变为降序
return { columnKey, order: 'descend' };
} else if (prevConfig.order === 'descend') {
// 如果已经是降序,则取消排序
return { columnKey: null, order: null };
}
// 默认返回初始状态
return { columnKey: null, order: null };
});
};
const sortedData = React.useMemo(() => {
if (!sortConfig.columnKey) return dataSource;
return [...dataSource].sort((a, b) => {
if (sortConfig.order === 'ascend') {
return a[sortConfig.columnKey] > b[sortConfig.columnKey] ? 1 : -1;
}
if (sortConfig.order === 'descend') {
return a[sortConfig.columnKey] < b[sortConfig.columnKey] ? 1 : -1;
}
return 0;
});
}, [dataSource, sortConfig]);
const columns = [
{
title: 'Name',
dataIndex: 'name',
key: 'name',
render: (text, record) => (
<div className="flex items-center">
{text}
<div className="ml-2 flex flex-col cursor-pointer">
<CaretUpOutlined
onClick={() => handleSort('name')}
style={{ color: sortConfig.columnKey === 'name' && sortConfig.order === 'ascend' ? 'blue' : 'gray' }}
/>
<CaretDownOutlined
onClick={() => handleSort('name')}
style={{ color: sortConfig.columnKey === 'name' && sortConfig.order === 'descend' ? 'blue' : 'gray' }}
/>
</div>
</div>
)
},
{
title: 'Age',
dataIndex: 'age',
key: 'age',
render: (text, record) => (
<div className="flex items-center">
{text}
<div className="ml-2 flex flex-col cursor-pointer">
<CaretUpOutlined
onClick={() => handleSort('age')}
style={{ color: sortConfig.columnKey === 'age' && sortConfig.order === 'ascend' ? 'blue' : 'gray' }}
/>
<CaretDownOutlined
onClick={() => handleSort('age')}
style={{ color: sortConfig.columnKey === 'age' && sortConfig.order === 'descend' ? 'blue' : 'gray' }}
/>
</div>
</div>
)
},
{
title: 'Score',
dataIndex: 'score',
key: 'score',
render: (text, record) => (
<div className="flex items-center">
{text}
<div className="ml-2 flex flex-col cursor-pointer">
<CaretUpOutlined
onClick={() => handleSort('score')}
style={{ color: sortConfig.columnKey === 'score' && sortConfig.order === 'ascend' ? 'blue' : 'gray' }}
/>
<CaretDownOutlined
onClick={() => handleSort('score')}
style={{ color: sortConfig.columnKey === 'score' && sortConfig.order === 'descend' ? 'blue' : 'gray' }}
/>
</div>
</div>
)
}
];
return (
<Table
dataSource={sortedData}
columns={columns}
rowKey="id"
pagination={false}
/>
);
};
export default CustomSortTable;
5 回答8.2k 阅读
2 回答10.4k 阅读✓ 已解决
2 回答10.6k 阅读✓ 已解决
3 回答4.7k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答1.8k 阅读
3 回答2.2k 阅读✓ 已解决