4

我正在使用yup模块来验证我的表单。我想访问父级以测试该值。

我的架构:

enabled: yup.boolean(),
contactDetail: yup.object().shape({
  phoneNumber1: yup.string().nullable(),
  phoneNumber2: yup.string().nullable(),
  email: yup.string().test('email', 'test', async function() {
    // test enabled value
  })
}),

该方法when可以在同一级别访问,而不是父级。

有人有想法吗?

4

2 回答 2

5

我遇到了类似的问题。我成功地使用了这个解决方法。

想法:将整个表单数据作为上下文传递给模式并使用访问任何表单值

this.options.context

  const schema = yup.object().shape({
        enabled: yup.boolean(),
        contactDetail: yup.object().shape({
          phoneNumber1: yup.string().nullable(),
          phoneNumber2: yup.string().nullable(),
          email: yup.string().test('email', 'test', async function () {
            // this.options.context.enabled

          }),
        }),
      });

传递上下文

没有福米克

在验证时将您的表单数据作为上下文发送

 schema.validateSync(data, {context: form_data})

与福米克

使用validate而不是validationSchema

将表单数据作为validateYupSchema中的第四个参数传递,它表示上下文,以后可以在模式中访问。

将您的架构作为validateYupSchema的第二个参数传递。

    <Formik
      validate={(value) => {
        try {
          validateYupSchema(value, schema, true, value);
        } catch (err) {
          return yupToFormErrors(err); //for rendering validation errors
        }

        return {};
      }}

       onSubmit={} />
于 2020-06-02T09:53:56.530 回答
0

您可以使用https://github.com/jquense/yup#mixedtestname-string-message-string--function-test-function-schema中提供的测试方法。像下面的示例一样,您可以使用 this.parent 在 test() 中访问一级父级详细信息。

amount: Yup.string().test('amount-test3', 'amount is required', function (value) {
                    const { description } = this.parent;
                    return !(!!description && !Number(value));
                  })
于 2019-09-19T09:52:46.787 回答