如何使用 Yup 验证开始日期是否晚于结束日期?
How do I validate if a start date is after an end date with Yup?
我有一个使用 Formik 库创建事件的表单。我需要检查开始日期是否与结束日期重叠,反之亦然。我有两个选择日期和时间的日期选择器。我如何使用 Yup 来验证这一点并在它们重叠时显示错误消息?
提前感谢您的帮助
const validationSchema = Yup.object().shape({
eventName: Yup.string()
.min(1, "Must have a character")
.max(10, "Must be shorter than 255")
.required("Must enter an event name"),
email: Yup.string()
.email("Must be a valid email address")
.max(255, "Must be shorter than 255")
.required("Must enter an email"),
eventStartDate: Yup.date()
.required("Must enter start date"),
eventEndDate: Yup.date()
.required("Must enter end date")
})
var defaultValue = new Date().toDateString
export default function EventForm(){
return (
<Formik
initialValues={{eventName: "", email: "", }}
validationSchema={validationSchema}
onSubmit={(values, {setSubmitting, resetForm}) => {
setTimeout(() => {
}}
>
{ ({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting
}) => (
<form onSubmit={handleSubmit}>
<div className="input-row">
<TextField
id="eventName"
label="Event Name"
margin="normal"
variant="filled"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventName}
className={touched.eventName && errors.eventName ? "has-error" : null}
/>
<Error touched={touched.eventName} message={errors.eventName}/>
</div>
<div className="dateHolder">
<div className="startDate">
<TextField
id="eventStartDate"
label="Event Start Date"
type="datetime-local"
InputLabelProps={{
shrink: true
}}
format="yyy-dd-mm HH:MM:ss"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventStartDate}
/>
<Error touched={touched.eventStartDate} message={errors.eventStartDate}/>
</div>
<div className="endDate">
<TextField
id="eventEndDate"
label="Event End Date"
type="datetime-local"
InputLabelProps={{
shrink: true
}}
format="yyy-dd-mm HH:MM:ss"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventEndDate}
/>
<Error touched={touched.eventEndDate} message={errors.eventEndDate}/>
</div>
</div>
<div className="input-row">
<button type="submit" disabled={isSubmitting} >
Submit
</button>
</div>
</form>
)}
</Formik>
)
}
您可以使用when
条件:
eventStartDate: yup.date().default(() => new Date()),
eventEndDate: yup
.date()
.when(
"eventStartDate",
(eventStartDate, schema) => eventStartDate && schema.min(eventStartDate))
使用ref
效果很好
yup.object().shape({
startDate: date(),
endDate: date().min(
yup.ref('startDate'),
"end date can't be before start date"
)
});
纳德的回答对我有用。
但是我有一些额外的验证条件,如果选中一个复选框,则在结束日期之前验证日期开始日期。所以,我想出了这段代码。离开以防将来有人需要这个
Yup.object.shape({
ServiceCheck: Yup.boolean().default(false),
StartDateTime: Yup.date().when('ServiceCheck', {
is: (ServiceCheck=> {
return (!!ServiceCheck) ? true : false;
}),
then: Yup.date().required('Start Date/Time is required')
}).nullable(),
EndDateTime: Yup.date().when('ServiceCheck', {
is: (ServiceCheck=> {
return (!!ServiceCheck) ? true : false;
}),
then: Yup.date().min(Yup.ref('StartDateTime'),
"End date can't be before Start date").required('End Date/Time is required')
}).nullable(),
})
无条件
Yup.object().shape({
StartDate: Yup.date(),
EndDate: Yup.date().min(
Yup.ref('StartDate'),
"End date can't be before Start date"
)
});
我有一个使用 Formik 库创建事件的表单。我需要检查开始日期是否与结束日期重叠,反之亦然。我有两个选择日期和时间的日期选择器。我如何使用 Yup 来验证这一点并在它们重叠时显示错误消息?
提前感谢您的帮助
const validationSchema = Yup.object().shape({
eventName: Yup.string()
.min(1, "Must have a character")
.max(10, "Must be shorter than 255")
.required("Must enter an event name"),
email: Yup.string()
.email("Must be a valid email address")
.max(255, "Must be shorter than 255")
.required("Must enter an email"),
eventStartDate: Yup.date()
.required("Must enter start date"),
eventEndDate: Yup.date()
.required("Must enter end date")
})
var defaultValue = new Date().toDateString
export default function EventForm(){
return (
<Formik
initialValues={{eventName: "", email: "", }}
validationSchema={validationSchema}
onSubmit={(values, {setSubmitting, resetForm}) => {
setTimeout(() => {
}}
>
{ ({
values,
errors,
touched,
handleChange,
handleBlur,
handleSubmit,
isSubmitting
}) => (
<form onSubmit={handleSubmit}>
<div className="input-row">
<TextField
id="eventName"
label="Event Name"
margin="normal"
variant="filled"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventName}
className={touched.eventName && errors.eventName ? "has-error" : null}
/>
<Error touched={touched.eventName} message={errors.eventName}/>
</div>
<div className="dateHolder">
<div className="startDate">
<TextField
id="eventStartDate"
label="Event Start Date"
type="datetime-local"
InputLabelProps={{
shrink: true
}}
format="yyy-dd-mm HH:MM:ss"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventStartDate}
/>
<Error touched={touched.eventStartDate} message={errors.eventStartDate}/>
</div>
<div className="endDate">
<TextField
id="eventEndDate"
label="Event End Date"
type="datetime-local"
InputLabelProps={{
shrink: true
}}
format="yyy-dd-mm HH:MM:ss"
onChange={handleChange}
onBlur={handleBlur}
value={values.eventEndDate}
/>
<Error touched={touched.eventEndDate} message={errors.eventEndDate}/>
</div>
</div>
<div className="input-row">
<button type="submit" disabled={isSubmitting} >
Submit
</button>
</div>
</form>
)}
</Formik>
)
}
您可以使用when
条件:
eventStartDate: yup.date().default(() => new Date()),
eventEndDate: yup
.date()
.when(
"eventStartDate",
(eventStartDate, schema) => eventStartDate && schema.min(eventStartDate))
使用ref
效果很好
yup.object().shape({
startDate: date(),
endDate: date().min(
yup.ref('startDate'),
"end date can't be before start date"
)
});
纳德的回答对我有用。 但是我有一些额外的验证条件,如果选中一个复选框,则在结束日期之前验证日期开始日期。所以,我想出了这段代码。离开以防将来有人需要这个
Yup.object.shape({
ServiceCheck: Yup.boolean().default(false),
StartDateTime: Yup.date().when('ServiceCheck', {
is: (ServiceCheck=> {
return (!!ServiceCheck) ? true : false;
}),
then: Yup.date().required('Start Date/Time is required')
}).nullable(),
EndDateTime: Yup.date().when('ServiceCheck', {
is: (ServiceCheck=> {
return (!!ServiceCheck) ? true : false;
}),
then: Yup.date().min(Yup.ref('StartDateTime'),
"End date can't be before Start date").required('End Date/Time is required')
}).nullable(),
})
无条件
Yup.object().shape({
StartDate: Yup.date(),
EndDate: Yup.date().min(
Yup.ref('StartDate'),
"End date can't be before Start date"
)
});