Спасибо за песочницу.
На основе вашей песочницы мне удалось выполнить итерации полей с помощью функции map
.
Сначала разделите уникальные реквизиты поля
- Реквизиты, принадлежащие входу, например
name
id
label
et c. - Реквизит, который принадлежит компоненту, например
variant
margin
handlers
и c.
В итоге вы получите 2 объекта.
(1) Тот, который должен быть абстрактным для компонента и сохранен в отдельном файле, вы можете использовать поля в другом компоненте позже.
Здесь, поскольку вы используете formik и вам нужен ссылочный ключ для formik, я добавил formikRef
в объект.
const fileds = [
{
id: "email",
name: "email",
formikRef: "email",
label: "Email"
},
{
id: "name",
name: "name",
formikRef: "name",
label: "Name"
}
];
(2) Второй объект, который должен храниться в компоненте, поскольку он разрешает <TextField/>
реквизиты
Я обычно заключаю их в хук useMemo, поэтому его не нужно повторно объявлять, если объекты зависимостей не изменены. Это только для производительности, вы также можете использовать прямой объект
const defaultProps = React.useMemo(() => ({
textField: {
variant: 'outlined',
margin: 'normal',
onChange: props => {
formik.handleChange(props);
formik.handleBlur(props);
},
onBlur: formik.handleBlur
}
}),
[formik]
);
//without useMemo
const defaultProps = {
textField: {
variant: 'outlined',
margin: 'normal',
onChange: props => {
formik.handleChange(props);
formik.handleBlur(props);
},
onBlur: formik.handleBlur
}
}
Последний шаг - отобразить реквизиты в рендере
{
fileds.map(({ formikRef, ...input }) => (
<TextField
key={formikRef}
helperText={getIn(formik.touched, formikRef) ? getIn(formik.errors, formikRef) : ''}
error={getIn(formik.touched, formikRef) && Boolean(getIn(formik.errors, formikRef))}
value={getIn(formik.values, formikRef)}
{...input}
{...defaultProps.textField}
/>
))
}
Я также создал рабочая песочница ЗДЕСЬ
LE: Проверка типа была проблемой, но решение могло быть найдено с небольшим поиском ... Это обсуждалось здесь
Я внес исправления и добавил getIn
вспомогательную функцию из Formik
, чтобы пройти проверку типов.