我是一名初学者,正在学习React/Typescript技术。我想要优化下面这个类:
import * as React from 'react';
import {Form, IFields, isEmail, required} from "../../components/Form";
import {Field} from "../../components/Field";
const API = '/api/getmonth';
export interface Props {
}
interface State {
data: string[],
isLoading: boolean,
error: any,
}
class monthForm extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
data: [],
isLoading: false,
error: null,
};
}
componentDidMount() {
this.setState({isLoading: true});
fetch(API)
.then(response => {
if (response.ok) {
return response.json();
} else {
throw new Error('Error getting month list');
}
})
.then(content => this.setState({data: content, isLoading: false}))
.catch(error => this.setState({error, isLoading: false}));
}
render() {
const {data, isLoading, error} = this.state;
if (error) {
return <p>{error.message}</p>;
}
if (isLoading) {
return (
<p>Loading ...</p>
)
}
const fields: IFields = {
jan: {
id: "jan",
label: "Jan",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
feb: {
id: "feb",
label: "Feb",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
mar: {
id: "mar",
label: "Mar",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
apr: {
id: "apr",
label: "Apr",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
may: {
id: "may",
label: "May",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
jun: {
id: "jun",
label: "Jun",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
jul: {
id: "jul",
label: "Jul",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
aug: {
id: "aug",
label: "Aug",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
sep: {
id: "sep",
label: "Sep",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
oct: {
id: "oct",
label: "Oct",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
nov: {
id: "nov",
label: "Nov",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
dec: {
id: "dec",
label: "Dec",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
};
return (
<Form
action="/react/test/form"
fields={fields}
render={() => (
<React.Fragment>
<div className="alert alert-info" role="alert">
Select Projection for each month
</div>
<div className="container">
<div className="row">
<div className="col-md-3">
<Field {...fields.jan}/>
<Field {...fields.feb}/>
<Field {...fields.mar}/>
<Field {...fields.apr}/>
<Field {...fields.may}/>
<Field {...fields.jun}/>
</div>
<div className="col-md-3">
<Field {...fields.jul}/>
<Field {...fields.aug}/>
<Field {...fields.sep}/>
<Field {...fields.oct}/>
<Field {...fields.nov}/>
<Field {...fields.dec}/>
</div>
</div>
</div>
</React.Fragment>
)}
/>
);
}
}
export default monthForm;
特别是这部分:
jan: {
id: "jan",
label: "Jan",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
feb: {
id: "feb",
label: "Feb",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
mar: {
id: "mar",
label: "Mar",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
apr: {
id: "apr",
label: "Apr",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
may: {
id: "may",
label: "May",
editor: "dropdown",
options: data,
value: "hello",
validation: {rule: required}
},
这个部分看起来很容易使用一个包含月份名称的const数组进行循环。但是我似乎找不到任何有关如何实现它的参考。
如果能提供任何帮助或指向参考示例,将不胜感激!
Object.entries
(为了完整性) - Socconst fields: IFields = {...}
部分(第二个代码块)的任何提示吗?如果我理解正确,那只是一个数组,但我想在循环中插入它,而不是声明整个东西,这大部分都是具有不同键的重复内容,谢谢! - tomlet month = ["jan", "feb", "mar"]
并在其上执行month.map(...)
,理想情况下,我将能够在此循环中创建巨大的fields
对象。 - tom