mirror of
https://github.com/ant-design/ant-design.git
synced 2025-06-11 19:42:54 +08:00

* docs: move mock api from randomuser.me to mocky.io * update * update * update * test: update snapshot
154 lines
3.9 KiB
TypeScript
154 lines
3.9 KiB
TypeScript
/* eslint-disable compat/compat */
|
|
import React, { useEffect, useState } from 'react';
|
|
import type { GetProp, TableProps } from 'antd';
|
|
import { Table } from 'antd';
|
|
import type { AnyObject } from 'antd/es/_util/type';
|
|
import type { SorterResult } from 'antd/es/table/interface';
|
|
|
|
type ColumnsType<T extends object = object> = TableProps<T>['columns'];
|
|
type TablePaginationConfig = Exclude<GetProp<TableProps, 'pagination'>, boolean>;
|
|
|
|
interface DataType {
|
|
name: string;
|
|
gender: string;
|
|
email: string;
|
|
id: string;
|
|
}
|
|
|
|
interface TableParams {
|
|
pagination?: TablePaginationConfig;
|
|
sortField?: SorterResult<any>['field'];
|
|
sortOrder?: SorterResult<any>['order'];
|
|
filters?: Parameters<GetProp<TableProps, 'onChange'>>[1];
|
|
}
|
|
|
|
const columns: ColumnsType<DataType> = [
|
|
{
|
|
title: 'Name',
|
|
dataIndex: 'name',
|
|
sorter: true,
|
|
width: '20%',
|
|
},
|
|
{
|
|
title: 'Gender',
|
|
dataIndex: 'gender',
|
|
filters: [
|
|
{ text: 'Male', value: 'male' },
|
|
{ text: 'Female', value: 'female' },
|
|
],
|
|
width: '20%',
|
|
},
|
|
{
|
|
title: 'Email',
|
|
dataIndex: 'email',
|
|
},
|
|
];
|
|
|
|
const toURLSearchParams = <T extends AnyObject>(record: T) => {
|
|
const params = new URLSearchParams();
|
|
for (const [key, value] of Object.entries(record)) {
|
|
params.append(key, value);
|
|
}
|
|
return params;
|
|
};
|
|
|
|
const getRandomuserParams = (params: TableParams) => {
|
|
const { pagination, filters, sortField, sortOrder, ...restParams } = params;
|
|
const result: Record<string, any> = {};
|
|
|
|
// https://github.com/mockapi-io/docs/wiki/Code-examples#pagination
|
|
result.limit = pagination?.pageSize;
|
|
result.page = pagination?.current;
|
|
|
|
// https://github.com/mockapi-io/docs/wiki/Code-examples#filtering
|
|
if (filters) {
|
|
Object.entries(filters).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null) {
|
|
result[key] = value;
|
|
}
|
|
});
|
|
}
|
|
|
|
// https://github.com/mockapi-io/docs/wiki/Code-examples#sorting
|
|
if (sortField) {
|
|
result.orderby = sortField;
|
|
result.order = sortOrder === 'ascend' ? 'asc' : 'desc';
|
|
}
|
|
|
|
// 处理其他参数
|
|
Object.entries(restParams).forEach(([key, value]) => {
|
|
if (value !== undefined && value !== null) {
|
|
result[key] = value;
|
|
}
|
|
});
|
|
|
|
return result;
|
|
};
|
|
|
|
const App: React.FC = () => {
|
|
const [data, setData] = useState<DataType[]>();
|
|
const [loading, setLoading] = useState(false);
|
|
const [tableParams, setTableParams] = useState<TableParams>({
|
|
pagination: {
|
|
current: 1,
|
|
pageSize: 10,
|
|
},
|
|
});
|
|
|
|
const params = toURLSearchParams(getRandomuserParams(tableParams));
|
|
|
|
const fetchData = () => {
|
|
setLoading(true);
|
|
fetch(`https://660d2bd96ddfa2943b33731c.mockapi.io/api/users?${params.toString()}`)
|
|
.then((res) => res.json())
|
|
.then((res) => {
|
|
setData(Array.isArray(res) ? res : []);
|
|
setLoading(false);
|
|
setTableParams({
|
|
...tableParams,
|
|
pagination: {
|
|
...tableParams.pagination,
|
|
total: 100,
|
|
// 100 is mock data, you should read it from server
|
|
// total: data.totalCount,
|
|
},
|
|
});
|
|
});
|
|
};
|
|
|
|
useEffect(fetchData, [
|
|
tableParams.pagination?.current,
|
|
tableParams.pagination?.pageSize,
|
|
tableParams?.sortOrder,
|
|
tableParams?.sortField,
|
|
JSON.stringify(tableParams.filters),
|
|
]);
|
|
|
|
const handleTableChange: TableProps<DataType>['onChange'] = (pagination, filters, sorter) => {
|
|
setTableParams({
|
|
pagination,
|
|
filters,
|
|
sortOrder: Array.isArray(sorter) ? undefined : sorter.order,
|
|
sortField: Array.isArray(sorter) ? undefined : sorter.field,
|
|
});
|
|
|
|
// `dataSource` is useless since `pageSize` changed
|
|
if (pagination.pageSize !== tableParams.pagination?.pageSize) {
|
|
setData([]);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Table<DataType>
|
|
columns={columns}
|
|
rowKey={(record) => record.id}
|
|
dataSource={data}
|
|
pagination={tableParams.pagination}
|
|
loading={loading}
|
|
onChange={handleTableChange}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default App;
|