是的:如何仅在字段存在时对其进行验证?

Yup: How to validate field only when it exists?

是否可以只在字段存在时才对其进行验证?

我要创建一个应用程序。字段(电子邮件)可能会/可能不会显示在第 2 步,这取决于第 1 步的选择选项。问题是我不能输入 email: Yup.string().Required(),这会导致验证一直 运行,甚至不显示该字段。

您需要手动处理,而不是必需的。只需要保持每个字段的状态。并检查它是否存在它的值,然后你需要显示它。 有些像这样

const [email, setEmail]= useState(null);

const onChange=(e)=>{
setEmail(e.target.value)
}

return (


<input type="text" onChange={onChnage}/>
)

并将此电子邮件传递给您的 parent,您将在那里检查验证。如果 email 中有任何内容,则显示它进行其他验证。或者如果它是空的或 Null 则不显示它。

谢谢

您可以设置一个额外的布尔键,其值默认为 false。当您在步骤 1 中修改值时将其更改为 true。然后如果该键的值是 true 则应用验证。

像这样。


    const initialSchema= {
      name: '',
      isEmail: false, // change this when you want to add validation
      email: '',
      phone: '',
    };
    
    const validationSchema = Yup.object().shape({
      name: Yup.string()
        .required('Enter Name')
      isEmail: Yup.boolean(),
      email: Yup.string().when('isEmail', {
         is: true,
         then: Yup.string()
         .required('Enter Email ID'),
         otherwise: Yup.string(),
      }),
      phone: Yup.string()
        .required('Enter Mobile No'),
    });

这是相同的documentation reference

更新:

Here 是工作代码和框。我用 display:none; 添加了复选框,并在数据上下文中添加了默认状态值。

我使用转换动态修改模式

  const updateUserValidator = yup.object().shape({
        email: yup.string(),
        updateBy: yup.string()
    }).transform(function (current, original) {
        this.fields.email = original?.email?.length === undefined ? yup().string().email() : yup().string().email().required()
        return current;
        })

我在这里看到了另一个相关的答案,也许这也是一个有效的解决方案?

https://github.com/jquense/yup/issues/1114

从那里复制代码:

const schema = yup.object({
    phone: yup.string().when('$exist', {
        is: exist => exist,
        then: yup.string().required(),
        otherwise: yup.string()
    })
})