首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yup动态验证链

Yup动态验证链
EN

Stack Overflow用户
提问于 2018-10-23 05:35:34
回答 2查看 3.5K关注 0票数 7

我正在使用yup验证,并试图构建一个条件验证对象。

我的问题是,如何将必需的和匹配的对象添加到Yup.string()对象中,而不需要对其进行硬编码。类似于如何链接jQuery函数。

下面是我正在努力实现的一个例子:

代码语言:javascript
复制
if (field.required) {
  valSchema[id] = Yup.string().required(errorText[id].default);
}
if (field.validation) {
  valSchema[id] = Yup.string().matches(re, field.validation[0].message);
}
if (field.otherValidation) {
  valSchema[id] = Yup.string().matches(re, field.validation[1].message);
}

显然,这是行不通的,因为最后一个为真的条件将覆盖以前的条件。

如果所有的条件都是真的,最终的结果会是这样的。

代码语言:javascript
复制
valSchema[id] = Yup.string()
  .required(errorText[id].default)
  .matches(reExp, field.validation[0].message);
  .matches(reExp1, field.validation[1].message);

有什么想法吗?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-09-08 13:09:24

要有条件地进行add/chain验证,可以使用Yup的.when方法。

此方法可以根据正在验证的值添加条件验证,也可以通过context对象添加条件验证,该对象可以作为选项参数传递给.validate.isValid调用。

我创建了下面的代码简化示例。此解决方案利用在验证期间传入的Yup的context对象。上下文对象的键使用$符号引用。

代码语言:javascript
复制
const schema = yup.object({
  name: yup.string()
    .when('$required', (required, schema) => (required ? schema.required() : schema))
    .when('$regex1', (regex1, schema) => (regex1 ? schema.matches(/j/) : schema))
    .when('$regex2', (regex2, schema) => (regex2 ? schema.matches(/oe/) : schema))
});

将下列对象作为上下文提供给您在所有条件都为真的问题中的最终结果:

代码语言:javascript
复制
{
  required: true,
  regex1: true,
  regex2: true,
}

将所有这些放在一起给您提供了以下工作示例:

代码语言:javascript
复制
const yup = require("yup");

const schema = yup.object({
  name: yup.string()
    .when('$required', (required, schema) => (required ? schema.required() : schema))
    .when('$regex1', (regex1, schema) => (regex1 ? schema.matches(/j/) : schema))
    .when('$regex2', (regex2, schema) => (regex2 ? schema.matches(/oe/) : schema))
});

const myObject = {
  name: "joe",
}

const name = await schema.validate(myObject, {
  context: {
    required: true,
    regex1: true,
    regex2: true,
  }
});

console.log(name); // { name: "joe" }

在RunKit上查看和测试代码,在这里:https://runkit.com/joematune/6138a7db98ff810008ef37ab

票数 1
EN

Stack Overflow用户

发布于 2022-07-23 03:15:18

我动态地构建整个yup对象。这适用于动态链接:

代码语言:javascript
复制
const schema = {};
fields.forEach(f => {
  switch(f.dataType){
    case "string":
      schema[f.id] = Yup.string();
      if (f.required) schema[f.id] = schema[f.id].required();
      if (f.min) schema[f.id] = schema[f.id].min(f.min);
  }
});

return Yup.object().shape(schema);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52941791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档