如何在 formik 字段组件中显示自定义 <Errormessage> 并禁用默认消息

Posted

技术标签:

【中文标题】如何在 formik 字段组件中显示自定义 <Errormessage> 并禁用默认消息【英文标题】:How to display custom <Errormessage> in formik field component and disable the default message 【发布时间】:2021-11-06 00:54:53 【问题描述】:

我正在使用React、Material、Formik、formik-material-ui 制作一个 Web 项目。

我已经使用yup 制作了一个Formik 表单进行验证。

const schema = yup.object(
    name: yup.string().trim().lowercase().required("Name is required."),
);

<Formik
    initialValues=
    name: "",
    
    validationSchema=schema
>
    ( submitForm, isSubmitting, handleSubmit, handleChange, values ) => (
        <Form noValidate onSubmit=handleSubmit>
            <Grid container direction="row" spacing=2>
                <Grid container item xs=12 spacing=4>
                    <Grid item xs=4>
                        <InputLabel>Patient Name *</InputLabel>
                        <TextField fullWidth name="name" type="text" />
                        <InputLabel>Patient ID: P0006</InputLabel>
                    </Grid>
                </Grid>
            </Grid>
        </Form>
    )
</Formik>

TextField是一个自定义组件如下

import React,  Fragment  from "react";
import  Field, ErrorMessage  from "formik";
import  TextField  from "libs/formik-material-ui/src";

const TextFieldStyle = 
    padding: 8,
    fontSize: "0.75rem",
;

export default React.memo((props: any) => 
    return (
        <Fragment>
            <Field
                component=TextField
                inputProps=
                    style: TextFieldStyle,
                
                size="small"
                margin="none"
                variant="outlined"
                ...props // add props at the key to override any user defined similar props
            >
                props.children
            </Field>
            <ErrorMessage name=props.name>(msg) => <div style= color: "red", textAlign: "left" >msg</div></ErrorMessage>
        </Fragment>
    );
);

由于我想显示另一种样式的 ErrorMessage 而不是默认样式,因此我在字段下方添加了。 但是使用这种方法,错误消息会被打印两次。

如何禁用打印默认消息?

【问题讨论】:

请查看文档link 【参考方案1】:

您可以使用helperText="" 禁用默认消息

<Field
  component=TextField
  inputProps=
    style: TextFieldStyle,
  
  size="small"
  margin="none"
  variant="outlined"
  helperText=""
  ...props // add props at the key to override any user defined similar props
>

【讨论】:

【参考方案2】:

您需要删除您的 msg 并让 formik 为您处理错误消息

如果要设置错误样式,请使用 formik 中的 className:

Formik 道具类型

export interface ErrorMessageProps 
    name: string;
    className?: string;
    component?: string | React.ComponentType;
    children?: ((errorMessage: string) => React.ReactNode);
    render?: ((errorMessage: string) => React.ReactNode);

所以你需要像这样使用它

<ErrorMessage name=props.name className="your-class" />;

【讨论】:

以上是关于如何在 formik 字段组件中显示自定义 <Errormessage> 并禁用默认消息的主要内容,如果未能解决你的问题,请参考以下文章

Formik 中如何保存输入字段中的数据

如何动态访问嵌套错误/触及formik字段

如何在不提交的情况下访问 formik 字段的当前值?

React Formik:如何使用自定义 onChange 和 onBlur

如何在 React 中使用 Formik 的自定义输入?

如何默认 formik 日期和时间字段以显示占位符值