【问题标题】:yup.js Validate number field is larger than sibling, or nullableyup.js 验证数字字段大于兄弟,或可为空
【发布时间】:2020-08-22 23:30:12
【问题描述】:

我正在使用 Yup.js 来验证一些表单字段。

我有两个整数字段,Year BuiltYear Renovated

Year Built 是必填字段,Year Renovated 不是。

翻新年份可以留空,但是如果有值它应该大于建造年份(因为翻新肯定必须在建造日期之后发生)。

我相信我需要使用 yup 的 ref() 以及 yup 的 when() 功能。我尝试了以下方法:

让 currentYear = new Date().getFullYear();

yup.object().shape({
  yearBuilt     : yup.number().integer().min(1700).max(currentYear+1).required(),
  yearRenovated : yup.number().integer().when(
                    '$yearRenovated', (yearRenovated, schema)=>{
                        return yearRenovated > 0 ? 
                            schema.min(yup.ref('yearBuilt')).max(currentYear+1) :
                            schema.transform(emptyStringToNull).nullable()
                    }
                )
})

* 转换函数emptyStringToNull 只检查是否value === '',如果是则返回null。

上面确实允许空值,以及正确检查整数。但是它没有正确评估yearRenovated > yearBuilt。如何正确检查yearRenovated 是否不为空,是否大于yearBuilt

非常感谢大家的帮助。

【问题讨论】:

    标签: reactjs validation yup


    【解决方案1】:

    是的(小于或等于):https://github.com/jquense/yup/issues/538#issuecomment-495340254

    如果您最终需要小于或等于实现 (

    number().max(5) // is <= 5
    

    【讨论】:

      【解决方案2】:
       billAmount: Yup.number().nullable(),
              approvedAmount: Yup.number().typeError('you must specify a number').notRequired().when('billAmount', (billAmount:any, schema:any) => {
                return schema.test({
                  test: (approvedAmount:any) =>   {
                    if(!approvedAmount) return true
                    return (approvedAmount < billAmount)
                  },
                  message: "Approved Amount not gether then billAmount",
                })
      

      【讨论】:

        【解决方案3】:

        @JQuense,repo 的所有者有一个雄辩的解决方案,使用moreThan()

        const schema = yup.object().shape({
            yearBuilt: yup
              .number()
              .integer()
              .min(1700)
              .max(currentYear+1)
              .required(),
            yearRenovated: yup
              .number()
              .integer()
              .nullable()
              .moreThan(yup.ref("yearBuilt")) //<-- a whole lot neater than using a when conditional...
              .max(currentYear+1)
        });
        

        希望对您有所帮助!谢谢@JQuense。

        【讨论】:

        • 非常干净和简单的检查方法谢谢@JQuense
        猜你喜欢
        • 2019-05-04
        • 2019-12-15
        • 2013-06-10
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2019-06-22
        相关资源
        最近更新 更多