【问题标题】:Validating a non-required number field with Yup使用 Yup 验证非必需的数字字段
【发布时间】:2021-12-05 23:22:43
【问题描述】:

我正在尝试验证一个可选的数字字段,因此允许为空。如果字段中有值,则必须为正数。

const schema = yup.object().shape({
    gpa: yup.number()
        .when('gpa', {
        is: (value) => value?.length > 0,
        then: yup.number().positive(numberPositiveMessage).typeError(numberMessage),
        otherwise: yup.number().notRequired().nullable(true).transform(value => (isNaN(value) ? undefined : value))
    },
    [
        ['gpa', 'gpa'],
    ]
);

它允许表单的其余部分验证字段何时为空,以及其中是否有正数,但如果我输入负数或字符串,它不会返回任何应有的错误。

【问题讨论】:

    标签: javascript reactjs yup


    【解决方案1】:

    避免使用required(),以便该字段是可选的。它只有在存在时才会被验证。

    gpa: yup
      .number()
      .positive()
      .nullable(true)
      .transform((_, val) => val === val ? val : null) // transform NaN to null
        

    【讨论】:

    • 我相信这是我尝试的第一件事......但如果我把它留空,我会一直得到这个:“gpa 必须是 number 类型,但最终值是:NaN (从值"" 转换)。”
    • 更新:我尝试从我的原始代码中添加.transform()gpa: yup.number().positive(numberPositiveMessage).typeError(numberMessage).transform(value => (isNaN(value) ? undefined : value)) 它主要工作,但它仍然允许输入字符串。
    • 修改了处理NaN值的答案
    • 有趣的是,现在使用您刚刚发布的新代码似乎将每个值都转换为字符串。例如,如果我输入 2,我会收到以下错误消息:gpa must be a 'number' type, but the final value was: '"2"'.
    猜你喜欢
    • 2019-07-11
    • 2019-07-09
    • 2019-09-29
    • 2021-12-04
    • 2021-11-01
    • 2012-05-23
    • 2019-01-06
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多