微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React-Datepicker with Formik and Yup:第一次模糊时未验证日期值,除了 .required()

如何解决React-Datepicker with Formik and Yup:第一次模糊时未验证日期值,除了 .required()

我在使用 Yup 验证的 Formik 表单中使用 react-datepicker。为了在 Formik 中集成 react-datepicker,我使用了 wrapper solution in this thread

当最初输入一个值时,.required() 会被检查,但任何其他验证都不会被检查。所以我没有立即得到我的 StartDate later than today 验证。如果我第二次重新进入控件并退出它,这些其他验证确实会被触发。因此,立即发生的唯一初始验证错误.required(),但对于任何其他错误,我需要重新触摸控件。有什么解决办法吗?

编辑: 我注意到 Formik 的 .touched 没有在第一个 DatePicker 输入上设置。它仅在后续触摸/输入时设置。

是的

startDate: yup.date().nullable().required('Start Date is required')
                                .min(new Date(),'Start Date must be later than today'),

DatePicker Wrapper -see this thread - 归功于 ToolmakerStever

我尝试添加 onCalendarClose 以强制根据此 DatePicker issue report 进行重新验证,并且确实可能​​会发生这种情况,但这也可能是 Yup 架构问题 - 我不确定。

const { setFieldValue,validateField,values,handleBlur } = useFormikContext();

   return (
        <DatePicker
            {...field} 
            {...props} 
            showMonthDropdown
            showYearDropdown            
            selected={(field.value && new Date(field.value)) || null}
            onChange={val => {
                setFieldValue(field.name,val);
            }}
            onCalendarClose={val => {
                // Force-validate onCalendarClose to avoid any potential DatePicker Blur issues
                // Didn't help
                validateField(props.name);
            }} 
            onBlur={e => {
                // Call Formik's handleBlur
                // Didn't help
                handleBlur(e);
            }}           
          
        />

    )

解决方法

我找到了解决办法。第一次没有将 DatePicker 标记为 touched。 DatePicker 公开了一个名为 onChangeRaw 的事件,我在其中强制触摸了控件。现在所有错误都会立即触发,无需重新触摸。

        onChangeRaw={e => {
            setFieldTouched(field.name,true,true);
        }}

这在 Formik 的 DatePicker Wrapper 中,as shown in this post

由于某种原因,React-Datepicker 有一个 Blur 错误,documented here。他们的模糊建议包括调用 onCalendarCloseonChangeRaw。但只有 onChangeRaw 对我有用。

,

使用 Field 创建包装器工作正常。验证被触发,没有任何问题。这是沙箱。

Formik DatePicker Example

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?