javascript - Formik 和 Material-UI

标签 javascript reactjs typescript material-ui formik

我正在尝试将 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 TextField 中传递 onChange 函数,因此 firstName 的表单值始终为 null,因此您总是会收到错误消息,即使您输入了名称也是如此。 尝试在您的 TextField 和 onChange 函数上添加名称或 ID,如下所示:

<Field
    validateOnBlur
    validateOnChange
    name="firstName"
    render={({ field, form }) => (
    <TextField
        name={"firstName"}
        error={
            Boolean(form.errors.firstName && form.touched.firstName)
        }
        onChange={formikBag.handleChange}
        onBlur={formikBag.handleBlur}
        helperText={
            form.errors.firstName &&
            form.touched.firstName &&
            String(form.errors.firstName)
        }
    />
    )}
/>

关于javascript - Formik 和 Material-UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111447/

相关文章:

javascript - TypeScript:如何在字符串数组上使用 Array.includes 可能未定义的值(可选链接)

javascript - 使用 React Hooks 输入千位分隔符

Angular - 在 forChild 路由中使用自定义预加载策略

javascript - 当我尝试将 vis.js 与 Svelte 结合使用时,出现意外标记 'export'

javascript - 为什么 parseInt 不忽略第一个符号或整数值的字符

javascript - 使用indexOf从列表中删除对象?

javascript - 在 map 项目上添加事件类 react

javascript - 按向下或向上箭头键仅突出显示过滤的项目

javascript - Vue Js 路由 - 没有路径的父级

javascript - 高阶组件上的 PropTypes