提交 228cd6c0 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 d53f1387
import { useState, useEffect } from 'react'; import { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
import { Table } from 'antd'; import { Table, Row, Col, Form, Button, Space } from 'antd';
import IconReset from '@/assets/images/icon/reset.png';
import IconReload from '@/assets/images/icon/reload.png';
import IconFilter from '@/assets/images/icon/filter.png';
export default function AppList(props) { const AppList = forwardRef((props, ref) => {
const { remote = {}, filters = [], ...reset } = props; const { remote = {}, filters = [], filterAside, ...rest } = props;
const [data, setData] = useState({ total: 0, list: [] }); const [data, setData] = useState({ total: 0, list: [] });
const [page, setPage] = useState({ current: 1, pageSize: 10 }); const [page, setPage] = useState({ current: 1, pageSize: 10 });
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
// 分页配置 // 分页配置
const pagination = { const pagination = {
total: 100,
showSizeChanger: true, showSizeChanger: true,
showQuickJumper: true, showQuickJumper: true,
pageSizeOptions: ['10', '20', '30', '40'],
showTotal: (total) => `共${total}条数据`, showTotal: (total) => `共${total}条数据`,
onChange: handlePageChange, onChange: handlePageChange,
}; };
// 获取列表数据 // 获取列表数据
async function fetchList() { async function fetchData() {
let { httpRequest, beforeRequest, callback, params } = remote; let { request, beforeRequest, afterRequest } = remote;
if (!httpRequest) return; if (!request) return;
setLoading(true);
let params = { page: page.current, page_size: page.pageSize, ...form.getFieldsValue() };
if (beforeRequest) { if (beforeRequest) {
params = beforeRequest(params); params = await beforeRequest(params);
} }
const res = await httpRequest(params); const res = await request(params);
const { list = [], total = 0 } = callback ? callback(res.data, params) : res.data || {}; const { list = [], total = 0 } = afterRequest
? await afterRequest(res.data, params)
: res.data || {};
setData({ list, total }); setData({ list, total });
setLoading(false);
} }
useEffect(() => {
fetchData();
}, [page]);
// 筛选 // 筛选
async function handleSearch() { async function handleSearch() {
setPage({ ...page, current: 1 }); setPage({ ...page, current: 1 });
await fetchList();
} }
// 重置 // 重置
async function handleReset() { async function handleReset() {
// 清空筛选条件 // 清空筛选条件
form.resetFields();
setPage({ ...page, current: 1 }); setPage({ ...page, current: 1 });
await fetchList();
} }
// 刷新 // 刷新
async function handleRefresh() { async function handleReload(isForce = false) {
await fetchList(); isForce ? await handleSearch() : await fetchData();
} }
// 分页改变 // 分页改变
async function handlePageChange(current, pageSize) { async function handlePageChange(current, pageSize) {
setPage({ current, pageSize }); setPage({ current, pageSize });
await handleRefresh();
} }
const onValuesChange = (changedValues, allValues) => {
const [value] = Object.values(changedValues);
!value && handleReload();
};
useImperativeHandle(ref, () => {
return { handleSearch, handleReset, handleReload };
});
const filterElement = (
<div className='app-list-filter' style={{ marginBottom: 20 }}>
<div className='app-list-filter' style={{ marginBottom: 20 }}>
<Row justify='space-between'>
<Col>
<Form layout='inline' autoComplete='off' form={form} onValuesChange={onValuesChange}>
{filters.map((item) => (
<Form.Item label={item.label} name={item.name} key={item.label}>
{item.element}
</Form.Item>
))}
<Space>
<Button
type='primary'
htmlType='button'
ghost
icon={<Icon src={IconFilter} />}
onClick={handleSearch}
>
筛选
</Button>
<Button
type='primary'
htmlType='button'
ghost
icon={<Icon src={IconReset} />}
onClick={handleReset}
>
重置
</Button>
<Button
type='primary'
htmlType='button'
ghost
icon={<Icon src={IconReload} />}
onClick={handleReload}
>
刷新
</Button>
</Space>
</Form>
</Col>
<Col>{filterAside}</Col>
</Row>
</div>
</div>
);
return (
<div className='app-list'>
{filters.length > 0 && filterElement}
<div className='app-list-table'>
<Table
bordered
dataSource={data.list}
loading={loading}
pagination={pagination}
{...rest}
></Table>
</div>
</div>
);
});
// useEffect(async () => { const Icon = ({ src }) => {
// const res = await fetchList(remote); const IconStyle = { height: '12px', objectFit: 'contain' };
// setDataSource(res.data.list || []); return <img src={src} style={IconStyle} />;
// }, []); };
return <Table bordered dataSource={data.list} pagination={pagination} {...reset}></Table>; export default AppList;
}
...@@ -80,7 +80,7 @@ httpRequest.interceptors.response.use( ...@@ -80,7 +80,7 @@ httpRequest.interceptors.response.use(
notification.error({ message: data.message || '请求错误' }); notification.error({ message: data.message || '请求错误' });
return Promise.reject(data); return Promise.reject(data);
} }
return data.data; return data;
}, },
(error) => { (error) => {
if (error.response) { if (error.response) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论