我在React JS中工作。我需要使用Formik和Yup对一个数组字段进行验证,如下所示。验证条件是这样一种方式,即输入时间不应等于或介于现有时间(已经输入的时间。例如:如果我输入14.05,它应该显示一个错误,因为输入时间已经在14.00(开始)和03.00(结束)之间)。我如何验证字段,我认为概念是清楚的。如果有任何疑问,请询问。
// API values
//home_delivery_monday_times: Array(3)
//0: {start: "09:00", end: "11:00"}
//1: {start: "14:00", end: "03:00 "}
//2: {start: "11:30", end: "13:00 "}
//length: 3
<Formik
initialValues={formData}
enableReinitialize={true}
validationSchema={yup.object({
settings: yup.object({
home_delivery_monday_times:
yup.array().of(yup.object({ start: yup.string() })).test("is-valid", "The value shouldn't equal or between the existing", function (value) {
return (
// Validating conditions
)
})
})
})}
onSubmit={(values: any, { setSubmitting }) => {
console.log("values", values)
}}
>
{formik =>
.....}
{formik?.values?.settings?.home_delivery_monday_times?.map((item: any, index: any) => (
<>
{index != 0 &&
<div className="p-col-12 p-sm-2 p-md-2" />
}
<div className="p-col-5 p-sm-4 p-md-4">
<label>Start</label>
<Field as={Calendar} value={item?.start ? new Date(`01-01-2000 ${item?.start}:00`) : ''} onSelect={(e: any) => { formik?.setFieldValue(`settings.home_delivery_monday_times.${index}.start`, moment(e?.value).format("HH:mm")) }} name={`settings.home_delivery_monday_times.${index}.start`} readOnlyInput={true} timeOnly />
<div className='p-col-12'>
<ErrorMessage name={`settings.home_delivery_monday_times.${index}.start`} component={FormErrorMsg} />
</div>
</div>
<div className="p-col-5 p-sm-4 p-md-4">
<label>End</label> <br />
<Field as={Calendar} value={item?.end ? new Date(`01-01-2000 ${item?.end?.trim()}:00`) : ''} onSelect={(e: any) => { formik?.setFieldValue(`settings.home_delivery_monday_times.${index}.end`, moment(e?.value).format("HH:mm")) }} name={`settings.home_delivery_monday_times.${index}.end`} readOnlyInput={true} timeOnly />
</div>
<div className="p-col-1 p-sm-2 p-md-2">
{index != 0 &&
<FiXCircle name="name" color="red" size="20px" onClick={() => formik?.values?.settings?.home_delivery_monday_times?.splice(index, 1)} />
}
</div>
</>
))}
2条答案
按热度按时间relj7zay1#
EDIT我建议使用moment库,然后您可以使用以下代码:
下面是codesandbox,供您试用
oknwwptz2#
虽然这篇文章已经很老了,但它作为我自己的可用性编辑组件的起点,对我帮助很大。
要回答这个问题,找出两个区间是否重叠是相当容易的。
如果我们有两个像上面这样的时间间隔,其中每个数字代表一个小时,我们可以使用下面的公式来确定它们是否重叠:
简单来说这个等式是如果第一个间隔的结束时间在下一个间隔的开始时间之后,则间隔重叠。
baeldung的信用额度
现在,要在代码中实现这一点,我们需要使用上面的比较公式来比较所有的区间。
baeldung的信用额度
既然@Rishabh Singh提供了朴素方法的答案,我将提供一个修订版,做以下一些改进:
1.用更小、更现代的datefns库替换moment.js
1.用更快的扫描线方法O(n*log(n))替换简单比较O(n^2)
1.添加对一周中多天的支持
1.当开始/结束时间不是有效的hh:mm格式时,添加formik验证
1.当时隙不按升序排列时,添加formik验证
这是codesandbox链接