【问题标题】:Validation at form level on multiple fields with Yup and react-hook-form使用 Yup 和 react-hook-form 在多个字段的表单级别进行验证
【发布时间】:2021-09-30 22:18:10
【问题描述】:

我目前有以下带有 react-hook-form 的 Yup 验证模式:

  const schema = yup.object().shape({
    externallyPrintedLabelsQty: yup
      .number()
      .typeError("Number of Labels (printed outside) must be a number")
      .required()
      .integer()
      .min(0)
      .max(2)
      .test(
        "maxLabels",
        "A maximum of two labels per pack, either printed internally or externally, is allowed.",
        function (value: any) {
          const { internallyPrintedLabelsQty } = this.parent;
          return value + internallyPrintedLabelsQty < 3;
        }
      ),
    internallyPrintedLabelsQty: yup
      .number()
      .typeError("Number of Labels (printed inside) must be a number")
      .required()
      .integer()
      .min(0)
      .max(2),
  });

这很好用。但是,.test 验证附加到特定字段(即externallyPrintedLabelsQty)。 有没有办法将.test 附加到整个表单而不是特定字段,或者测试用户是否在表单级别选择了超过 2 个标签,无论它们是在内部还是外部打印?

提前感谢您的帮助。

【问题讨论】:

    标签: javascript reactjs yup react-hook-form


    【解决方案1】:

    .test也是Yup.object的一个方法。这意味着将.test 附加到您的ObjectSchema 就可以了,如下所示:

    const schema = yup
        .object()
        .shape({
            externallyPrintedLabelsQty: yup
                .number()
                .typeError('Number of Labels (printed outside) must be a number')
                .required()
                .integer()
                .min(0)
                .max(2),
            internallyPrintedLabelsQty: yup
                .number()
                .typeError('Number of Labels (printed inside) must be a number')
                .required()
                .integer()
                .min(0)
                .max(2),
        })
        .test(
            'maxLabels',
            'A maximum of two labels per pack, either printed internally or externally, is allowed.',
            (value) => {
                const externallyPrintedLabelsQty =
                    value?.externallyPrintedLabelsQty ?? 0;
                const internallyPrintedLabelsQty =
                    value?.internallyPrintedLabelsQty ?? 0;
    
                return externallyPrintedLabelsQty + internallyPrintedLabelsQty < 3;
            }
        );
    

    【讨论】:

    • 这绝对是一个正确的答案。但是,react-hook-form 似乎只在提交时运行完整验证并显示错误,而不是在从一个字段移动到另一个字段时。您对如何运行 .test 并在模糊时显示错误有什么建议吗?
    • 已经有一个关于 SO 的已解决问题,并附有您可能正在寻找的示例 here
    猜你喜欢
    • 2021-11-05
    • 2022-11-11
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2020-02-05
    • 2021-10-05
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多