【问题标题】:Conditional validation of multiple fields using Yup使用 Yup 对多个字段进行条件验证
【发布时间】:2021-10-20 21:11:19
【问题描述】:

我有 3 个输入字段(姓名、ID 和邮政编码),我使用 formik 和 Yup 进行验证。

我想在这里实现的是,我想将每个输入字段与已知的名称、id 和邮政编码组合匹配(我有一个预定义的 id、名称、邮政编码的默认值)。

如果在所有 3 个输入字段中输入的值与名称、id 和邮政编码的默认值完全匹配,那么我必须在每个字段上显示 formik 错误(*不允许默认值)。如果这些字段之一与默认值不同,请不要在任何字段上显示错误。

例如,如果我的每个字段的默认值为 name="testName"、id="testID"、postCode="testPostCode",则在每个字段上显示验证错误仅在 所有 3 个输入值都与 defaultValues 匹配。

这就是我现在所拥有的:

const defaultValues = {
  name: 'testName',
  id: 'testID',
  postCode: 'testPostCode'
}

const YUP_STRING = Yup.string().ensure().trim();

const validationSchema = yup.object().shape({
   name: YUP_STRING.required('required'),
   id: YUP_STRING.required('required'),
   postcode: YUP_STRING.required('required'),
})

我尝试了几种变体,但这里没有任何效果。谁能帮我找到解决方案?

【问题讨论】:

    标签: formik yup


    【解决方案1】:

    你可以做类似 <Field validate={(value)=>validate(value,values)} name="name" type="text" />

    更详细..

    <Formik
         initialValues={defaultValues}
         onSubmit={values => alert(JSON.stringify(values)}
       >
         {({ errors, touched, values }) => (
           <Form>
             <Field validate={(value) => validate(value, values)} name="name" type="text" />
             {errors.name && touched.name ? <div>{errors.name}</div> : null}
             <button type="submit">Submit</button>
           </Form>
         )}
    </Formik>
    

    并将验证函数定义为

    const validate = (value, values) => {
      if(values === defaultValues){
        return "Default Values not allowed"
      } else return undefined
    }
    

    或者如果你想用validationSchema来做,你可以通过在每个字段上添加test函数来做一些事情,我只为名字做了:

    const validationSchema = yup.object().shape({
       name: YUP_STRING.required('required')
             .test('name', "No default please", function (item) {
                       const currentValues = {
                           name: this.parent.name,
                           id: this.parent.id,
                           postCode: this.parent.postCode
                         }
                       return !(currentValues === defaultValues)
                  }
              ),
       id: YUP_STRING.required('required'),
       postcode: YUP_STRING.required('required'),
    })
    

    没有箭头功能可以使用this

    【讨论】:

    • 这似乎有点复杂,有没有办法通过在我拥有的validationSchema对象中添加一些额外的测试来做到这一点?
    • 我不这么认为,afaik,您无法从 yup 验证模式访问所有默认值。您可以通过我上面提到的这种方式进行调整,使其对每个字段或表单更加模块化。
    • 我可以在这里访问validationSchema 中的defaultValues。这就是为什么我只是在同一个范围内声明它。
    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 2019-01-06
    • 2021-06-27
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2021-09-30
    • 2021-11-01
    相关资源
    最近更新 更多