【发布时间】:2019-02-06 05:59:48
【问题描述】:
我正在尝试将 Formik 与 Material-UI 文本字段一起使用。像这样:
import TextField from '@material-ui/core/TextField';
import {
Field,
FieldProps,
Form,
Formik,
FormikErrors,
FormikProps
} from 'formik';
import React, { Component } from 'react';
interface IMyFormValues {
firstName: string;
}
class CreateAgreementForm extends Component<{}> {
public render() {
return (
<div>
<h1>My Example</h1>
<Formik
initialValues={{ firstName: '' }}
// tslint:disable-next-line:jsx-no-lambda
onSubmit={(values: IMyFormValues) => alert(JSON.stringify(values))}
// tslint:disable-next-line:jsx-no-lambda
validate={(values: IMyFormValues) => {
const errors: FormikErrors<IMyFormValues> = {};
if (!values.firstName) {
errors.firstName = 'Required';
}
return errors;
}}
// tslint:disable-next-line:jsx-no-lambda
render={(formikBag: FormikProps<IMyFormValues>) => (
<Form>
<Field
name="firstName"
render={({ field, form }: FieldProps<IMyFormValues>) => (
<TextField
error={Boolean(
form.errors.firstName && form.touched.firstName
)}
helperText={
form.errors.firstName &&
form.touched.firstName &&
String(form.errors.firstName)
}
/>
)}
/>
</Form>
)}
/>
</div>
);
}
}
export default CreateAgreementForm;
我希望 Formik 负责外观的验证和 Material-UI。 我想将 errors.firstName 传递给 TextField 组件,但错误显示不正确。我怎样才能修复它,这样它仍然可以清楚地阅读?我不想编写自己的 TextField 组件。
【问题讨论】:
-
我不知道如何将 Material-ui 组件与 Formik 验证集成,但我可以推荐 react-final-form ,它与 MUI 集成得很好:github.com/final-form/react-final-form#material-ui-10
-
谢谢,但我仍然需要为每个 material-ui 组件创建自定义组件。我宁愿不要。你知道怎么做吗?
-
这看起来有点矫枉过正,但我们发现像这样包装 material-ui 表单组件实际上很简单直接。我认为您总是必须以某种方式将“FormXXX”框架道具映射到 Material-UI 组件。
-
你可以看看这个项目做了什么:github.com/stackworx/formik-material-ui/tree/master/src
-
我真的认为您应该考虑为每个 Material-UI 组件创建自定义组件。原因如下:不要重复自己(Formik API 到 MUI props 的映射是一次性完成的),限制未来 MUI 或 Formik 重大变化的影响。
标签: javascript reactjs typescript material-ui formik