是的嵌套模式验证

Xav*_*ram 7 javascript yup formik

我正在尝试根据用户选择的 Select Option 有条件地验证对象,问题是我正在呈现货币列表并且在尝试使其成为必填字段时遇到了巨大的困难,因为我必须传入一个空的对象开始。

我的代码堆栈是 React、Formik 和 Yup(所有最新版本)。

对象架构

category: 'A',
details: {
   name: '',
   price: 0,
   stock: 0,
   currency: {
      label: '',
      code: '',
      symbol: '',
      alpha_2: '',
    }
}
Run Code Online (Sandbox Code Playgroud)

是的模式

category: Yup.string().required('You must pick a category'),
details: Yup.object().when('category', {
  is: 'A',
  then: Yup.object({
       label: Yup.string().required(`Select the currency you're retailing in`),
        code: Yup.string().required(`Select the currency you're retailing in`),
        symbol: Yup.string().required(`Select the currency you're retailing in`),
        alpha_2: Yup.string().required(`Select the currency you're retailing in`),
    }),
})
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,表单正在通过验证,并且货币对象有一个空值列表'',这是不希望的结果。

您如何进行架构触发器验证?

Gje*_*riu 16

您没有针对存储details.currency位置label/code/symbol/alpha_2进行验证。在schema.details,then应该由一个存储在属性中的Yup.object另一个组成,然后定义您想要的验证。Yup.objectcurrencylabel/code/symbol/alpha_2

例子:

const yup = require("yup");

const schema = yup.object({
    category: yup.string().required('You must pick a category'),
    details: yup.object().when('category', {
        is: 'A',
        then: yup.object({
            currency: yup.object({
                label: yup.string().required(`[1] Select the currency you're retailing in`),
                code: yup.string().required(`[2] Select the currency you're retailing in`),
                symbol: yup.string().required(`[3] Select the currency you're retailing in`),
                alpha_2: yup.string().required(`[4] Select the currency you're retailing in`),
            })
        }),
    })
})

let state = {
    category: 'A',
    details: {
        name: '',
        price: 0,
        stock: 0,
        currency: {
            label: 'a',
            code: 'b',
            symbol: 'c',
            alpha_2: 'd',
        }
    }
}

schema.validate(state).then(console.log).catch(err => console.log(err))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这只是一个简单的失误,我想当你盯着代码太久时你会变得目光短浅:D (6认同)