【问题标题】:Need to set up yup validation which is not required and works on only one condition需要设置 yup 验证,这不是必需的,仅适用于一种条件
【发布时间】:2022-01-14 00:31:14
【问题描述】:

我在日期选择器中添加了 yup 验证,所以如果我点击提交现在会发生什么,它说字段需要 无效日期! 但我的任务需要设置验证,例如只有在以下情况下才会生成错误该日期大于我在 max 中添加的今天的日期,并且它也没有添加到任何 .required("Required!") 事物中,但不确定它为什么按要求工作!我不需要设置为必填字段!

const today = moment().format("YYYY-MM-DD");
const validationSchema = yup.object().shape({
  date_of_birth: yup
    .date()
    .max(today, "DOB cannot be greater than today's date")
    .typeError("Invalid Date!")
});

export default function MaterialUIPickers() {
  const IndivisualForm = useFormik({
    initialValues: {
      date_of_birth: null
    },
    enableReinitialize: true,
    validationSchema,
    onSubmit: (values) => {
    }
  });
  const handleChangeDate = (date) => {
    IndivisualForm.setFieldValue(
      "date_of_birth",
      moment(date).format("YYYY-MM-DD")
    );
  };

  return (
    <MuiPickersUtilsProvider utils={DateFnsUtils}>
      <Grid container justifyContent="space-around">
        <KeyboardDatePicker
          disableToolbar
          variant="inline"
          format="MM/dd/yyyy"
          margin="normal"
          id="date-picker-inline"
          label="Date picker inline"
          value={IndivisualForm.values.date_of_birth}
          error={Boolean(IndivisualForm.errors.date_of_birth)}
          helperText={IndivisualForm.errors.date_of_birth}
          onChange={handleChangeDate}
          maxDate={today}
          KeyboardButtonProps={{
            "aria-label": "change date"
          }}
        />

        <Button
          color="primary"
          variant="contained"
          type="submit"
          onClick={IndivisualForm.handleSubmit}
        >
          Submit
        </Button>
      </Grid>
    </MuiPickersUtilsProvider>
  );
}

Code SandBox Link

【问题讨论】:

    标签: javascript reactjs yup


    【解决方案1】:

    不确定为什么max 应该在这里工作?

    理想情况下,当您想测试一些比较时。他们在那里有test 方法。所以基本上你需要这样做:

    const validationSchema = yup.object().shape({
      date_of_birth: yup
        .date()
        .nullable()
        .notRequired()
        .test(
          "Is date greater",
          "DOB cannot be greater than today's date",
          (value) => {
            if (!value) return true;
            return moment(today).diff(value) > 0;
          }
        )
    });
    
    

    这里是现场演示代码框:https://codesandbox.io/s/material-demo-forked-kbxlz?file=/demo.js

    或者直接看这里: https://kbxlz.csb.app/

    【讨论】:

    • 但这并不能解决我的问题
    • 它的行为类似于必填字段,但如果它大于今天的日期,我需要弹出一个错误,否则不需要弹出错误
    • 我不确定。仅当您选择大于今天的日期时才会弹出,否则不会弹出。你能解释更多吗?
    • 我的意思是当日期大于今天时,您可以在 yup 验证模式中看到它不是必填字段错误,但它的行为类似于必填字段意味着如果用户不选择任何日期用户能够提交不是必填字段
    • 我已经更新了代码。如果您不想验证是否未选择日期,这应该可以工作,并且只有在未选择日期时才会验证
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-12-05
    • 2020-12-27
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多