我如何基于两个条件设置yup验证?我正在使用TypeScript与Next.js和Formik

5jvtdoz2  于 2023-03-12  发布在  TypeScript
关注(0)|答案(1)|浏览(124)

如果此current属性的值等于true,并且此endedAt属性的值null,我想将此endedAt字段设置为必填字段。
以下是我的尝试:

validationSchema: Yup.object({
      title: Yup.string()
        .trim()
        .min(1, t('min-length-x', { x: 1 }))
        .max(128, t('max-length-x', { x: 128 }))
        .required(t('required')),
      organizationName: Yup.string()
        .trim()
        .min(1, t('min-length-x', { x: 1 }))
        .max(128, t('max-length-x', { x: 128 }))
        .required(t('required')),
      description: Yup.string()
        .trim()
        .min(0, t('min-length-x', { x: 0 }))
        .max(1024, t('max-length-x', { x: 1024 })),
      endedAt: Yup.date()
        .when(['current', 'endedAt'], {
          is: (!current, endedAt) => {
            return (!current && endedAt === null)
          },
          then: Yup.date().required(t('required')),
        })
    }),
bejyjqdl

bejyjqdl1#

你可以这样修改你的endAt,这样它就可以取current的值,lazy只是用来避免循环依赖错误。

const validationSchema = Yup.object({
title: Yup.string()
  .trim()
  .min(1, t("min-length-x", { x: 1 }))
  .max(128, t("max-length-x", { x: 128 }))
  .required(t("required")),
organizationName: Yup.string()
  .trim()
  .min(1, t("min-length-x", { x: 1 }))
  .max(128, t("max-length-x", { x: 128 }))
  .required(t("required")),
description: Yup.string()
  .trim()
  .min(0, t("min-length-x", { x: 0 }))
  .max(1024, t("max-length-x", { x: 1024 })),
current: Yup.boolean(),
endedAt: Yup.lazy((value) =>
  value && value.current
    ? Yup.date().required(t("required"))
    : Yup.date().nullable().default(null)
)

});
常量[表单数据,设置表单数据] =使用状态({标题:“",组织名称:“",说明:“",当前:false,结束时间:空});

相关问题