当使用 Ant Design 组件进行 form 表单查询,且列表接口和分页接口的数据格式不一致时,可以通过以下方法处理:
### 数据转换
在获取到接口数据后,对数据进行转换,使其符合组件的使用要求。例如,列表接口返回的数据可能包含一些多余的字段,或者字段名与 Table 组件需要的不一致,此时可以对数据进行筛选和重命名。
```jsx
import React, { useState, useEffect } from 'react';
import { Form, Input, Button, Table, Space } from 'antd';
// 模拟列表接口,返回的数据格式可能与组件需要的不一致
const fetchListData = async (params) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve([
{ itemId: 1, itemName: 'Item 1' },
{ itemId: 2, itemName: 'Item 2' },
]);
}, 500);
});
};
// 模拟分页接口,返回的数据格式可能与组件需要的不一致
const fetchPaginationData = async (params) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
totalCount: 10,
pageSize: 10,
currentPage: 1,
});
}, 500);
});
};
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
},
{
title: 'Name',
dataIndex: 'name',
key: 'name',
},
];
const App = () => {
const [form] = Form.useForm();
const [listData, setListData] = useState([]);
const [pagination, setPagination] = useState({
total: 0,
pageSize: 10,
current: 1,
});
const onFinish = async (values) => {
const listParams = { ...values, page: pagination.current, pageSize: pagination.pageSize };
const listResult = await fetchListData(listParams);
// 转换列表数据格式
const transformedListData = listResult.map(item => ({
id: item.itemId,
name: item.itemName,
}));
setListData(transformedListData);
const paginationParams = { ...values };
const paginationResult = await fetchPaginationData(paginationParams);
// 转换分页数据格式
const transformedPagination = {
total: paginationResult.totalCount,
pageSize: paginationResult.pageSize,
current: paginationResult.currentPage,
};
setPagination(transformedPagination);
};
const handleTableChange = async (newPagination) => {
const formValues = form.getFieldsValue();
const listParams = { ...formValues, page: newPagination.current, pageSize: newPagination.pageSize };
const listResult = await fetchListData(listParams);
const transformedListData = listResult.map(item => ({
id: item.itemId,
name: item.itemName,
}));
setListData(transformedListData);
const paginationParams = { ...formValues };
const paginationResult = await fetchPaginationData(paginationParams);
const transformedPagination = {
total: paginationResult.totalCount,
pageSize: paginationResult.pageSize,
current: newPagination.current,
};
setPagination(transformedPagination);
};
return (
<div>
<Form
form={form}
name="searchForm"
onFinish={onFinish}
initialValues={{
keyword: '',
}}
layout="inline"
>
<Form.Item
name="keyword"
rules={[
{
required: false,
message: 'Please input your keyword!',
},
]}
>
<Input placeholder="Search keyword" />
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit">
Search
</Button>
</Form.Item>
</Form>
<Table
columns={columns}
dataSource={listData}
pagination={pagination}
onChange={handleTableChange}
/>
</div>
);
};
export default App;
```
### 封装数据处理函数
将数据转换的逻辑封装成独立的函数,提高代码的可维护性和复用性。
```jsx
// 转换列表数据的函数
const transformListData = (listResult) => {
return listResult.map(item => ({
id: item.itemId,
name: item.itemName,
}));
};
// 转换分页数据的函数
const transformPaginationData = (paginationResult, currentPage) => {
return {
total: paginationResult.totalCount,
pageSize: paginationResult.pageSize,
current: currentPage,
};
};
// 在 onFinish 和 handleTableChange 中使用封装的函数
const onFinish = async (values) => {
const listParams = { ...values, page: pagination.current, pageSize: pagination.pageSize };
const listResult = await fetchListData(listParams);
const transformedListData = transformListData(listResult);
setListData(transformedListData);
const paginationParams = { ...values };
const paginationResult = await fetchPaginationData(paginationParams);
const transformedPagination = transformPaginationData(paginationResult, pagination.current);
setPagination(transformedPagination);
};
const handleTableChange = async (newPagination) => {
const formValues = form.getFieldsValue();
const listParams = { ...formValues, page: newPagination.current, pageSize: newPagination.pageSize };
const listResult = await fetchListData(listParams);
const transformedListData = transformListData(listResult);
setListData(transformedListData);
const paginationParams = { ...formValues };
const paginationResult = await fetchPaginationData(paginationParams);
const transformedPagination = transformPaginationData(paginationResult, newPagination.current);
setPagination(transformedPagination);
};
```
### 错误处理
在数据转换过程中,可能会出现一些错误,例如数据格式不符合预期等,需要进行错误处理,避免程序崩溃。
```jsx
const transformListData = (listResult) => {
try {
return listResult.map(item => ({
id: item.itemId,
name: item.itemName,
}));
} catch (error) {
console.error('Error transforming list data:', error);
return [];
}
};
const transformPaginationData = (paginationResult, currentPage) => {
try {
return {
total: paginationResult.totalCount,
pageSize: paginationResult.pageSize,
current: currentPage,
};
} catch (error) {
console.error('Error transforming pagination data:', error);
return {
total: 0,
pageSize: 10,
current: 1,
};
}
};
```