1//HTTPPOST.tsx
2import { Component, ReactNode } from 'react';
3import axios, { AxiosResponse } from 'axios';
4
5interface Props<T> {
6 url: string;//url
7 condition: unknown;//参数
8 loading?: ReactNode;//loading
9 children: (data: T) => ReactNode;//渲染组件
10 dataOperate: (data: T) => T;//数据处理
11 error?: ReactNode;//错误渲染
12}
13
14interface State<T> {
15 data: T;
16 component: ReactNode;
17}
18
19export default class POST<T> extends Component<Props<T>, State<T>> {
20 state: State<T> = {
21 data: {} as T,
22 component: this.props.loading || '',
23 };
24 async componentDidMount() {
25 const { url, error, condition, children, dataOperate } = this.props;
26 try {
27 const result: AxiosResponse<T> = await axios.post(url, condition);
28 const processedData: T = dataOperate(result.data);
29 this.setState({
30 data: processedData,
31 component: children(processedData),
32 });
33 } catch (e) {
34 this.setState({ component: error || 'error' });
35 throw e;
36 }
37 }
38 render() {
39 return this.state.component;
40 }
41}