Formik +是:如何在提交之前立即验证表单?

时间:2020-05-19 03:38:54

标签: reactjs formik yup

我想在安装表格时显示字段错误。提交后没有。

是的

const validation = Yup.object().shape({
  field: Yup.string().required('Required')
});

Formik:

<Formik
  initialValues={initialValues}
  validationSchema={validation}
  validateOnMount
>
  ...
</Formik>

感谢帮助!

2 个答案:

答案 0 :(得分:7)

简单的答案是

initialTouched传递到Formik,这将是一个带有要显示错误消息的字段的键以及这些键的值true的对象。

例如

<Formik
  initialValues={initialValues}
  initialTouched={{ 
    field: true,
  }}
  validationSchema={validation}
  validateOnMount
>
  ...
</Formik>

但是有很多方法可以做到这一点,但是您可以创建一个在初始渲染时调用validateForm的组件

const ValidateOnMount = () => {
    const { validateForm } = useFormikContext()

    React.useEffect(() => {
        validateForm()
    }, [])

    // the return doesn't matter, it can return anything you want
    return <></>
}

您也可以使用validateOnMount并在要显示错误消息的所有字段上将initialTouched设置为true(也许您只想在初始安装时显示某些字段的错误消息)来执行相同的操作

<Formik 
    validateOnMount
    initialValues={initialValues}
    validationSchema={validation}
    initialTouched={{ 
        field: true
    }}
    {...rest}
>
</Formik>

initialTouched应该是一个对象,该对象具有initialValues中要验证的所有字段的键,但键值为true,表示您已经触摸了该字段。


另一种方法是仅将validateOnMount传递给Formik并显示任何错误消息,而无需检查touched[name]
如果您使用formik中的ErrorMessage,它将无法工作,因为它会检查touched[name] === true以显示消息,因此您需要创建自己的显示错误的方式,而仅检查为errors[name]

答案 1 :(得分:0)

您可以像这样使用错误和感动的道具

<Formik 
    initialValues={initialValues} 
    validationSchema={validation} 
    validateOnMount 
> 
    {props => { 
        const { errors, touched } = props 
        return ( 
            <Form> 
                ... 
                {errors.field && touched.field ? <Error>{errors.field}</Error> : null} 
                ... 
            </Form> 
        )
    }
</Formik>