You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.4 KiB
113 lines
2.4 KiB
2 years ago
|
import React, { useEffect, useState } from 'react';
|
||
|
import { Table } from 'antd';
|
||
|
import type { ColumnsType, TablePaginationConfig } from 'antd/es/table';
|
||
|
import type { FilterValue, SorterResult } from 'antd/es/table/interface';
|
||
|
import qs from 'qs';
|
||
|
|
||
|
interface DataType {
|
||
|
name: {
|
||
|
first: string;
|
||
|
last: string;
|
||
|
};
|
||
|
gender: string;
|
||
|
email: string;
|
||
|
login: {
|
||
|
uuid: string;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
interface TableParams {
|
||
|
pagination?: TablePaginationConfig;
|
||
|
sortField?: string;
|
||
|
sortOrder?: string;
|
||
|
filters?: Record<string, FilterValue>;
|
||
|
}
|
||
|
|
||
|
const columns: ColumnsType<DataType> = [
|
||
|
{
|
||
|
title: 'Name',
|
||
|
dataIndex: 'name',
|
||
|
sorter: true,
|
||
|
render: name => `${name.first} ${name.last}`,
|
||
|
width: '20%',
|
||
|
},
|
||
|
{
|
||
|
title: 'Gender',
|
||
|
dataIndex: 'gender',
|
||
|
filters: [
|
||
|
{ text: 'Male', value: 'male' },
|
||
|
{ text: 'Female', value: 'female' },
|
||
|
],
|
||
|
width: '20%',
|
||
|
},
|
||
|
{
|
||
|
title: 'Email',
|
||
|
dataIndex: 'email',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
const getRandomuserParams = (params: TableParams) => ({
|
||
|
results: params.pagination?.pageSize,
|
||
|
page: params.pagination?.current,
|
||
|
...params,
|
||
|
});
|
||
|
|
||
|
const App: React.FC = () => {
|
||
|
const [data, setData] = useState();
|
||
|
const [loading, setLoading] = useState(false);
|
||
|
const [tableParams, setTableParams] = useState<TableParams>({
|
||
|
pagination: {
|
||
|
current: 1,
|
||
|
pageSize: 10,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const fetchData = () => {
|
||
|
setLoading(true);
|
||
|
fetch(`https://randomuser.me/api?${qs.stringify(getRandomuserParams(tableParams))}`)
|
||
|
.then(res => res.json())
|
||
|
.then(({ results }) => {
|
||
|
setData(results);
|
||
|
setLoading(false);
|
||
|
setTableParams({
|
||
|
...tableParams,
|
||
|
pagination: {
|
||
|
...tableParams.pagination,
|
||
|
total: 200,
|
||
|
// 200 is mock data, you should read it from server
|
||
|
// total: data.totalCount,
|
||
|
},
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
useEffect(() => {
|
||
|
fetchData();
|
||
|
}, [JSON.stringify(tableParams)]);
|
||
|
|
||
|
const handleTableChange = (
|
||
|
pagination: TablePaginationConfig,
|
||
|
filters: Record<string, FilterValue>,
|
||
|
sorter: SorterResult<DataType>,
|
||
|
) => {
|
||
|
setTableParams({
|
||
|
pagination,
|
||
|
filters,
|
||
|
...sorter,
|
||
|
});
|
||
|
};
|
||
|
|
||
|
return (
|
||
|
<Table
|
||
|
columns={columns}
|
||
|
rowKey={record => record.login.uuid}
|
||
|
dataSource={data}
|
||
|
pagination={tableParams.pagination}
|
||
|
loading={loading}
|
||
|
onChange={handleTableChange}
|
||
|
/>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
export default App;
|