rsuite / schema-typed

Schema for data modeling & validation
MIT License
198 stars 28 forks source link

数据之间相关性校验应该怎么处理 #4

Closed skchen28 closed 3 years ago

skchen28 commented 6 years ago

我这里有一个通用的需求,比如证件类型为“身份证”时,才对身份证进行合法性校验,这个时候我应该怎么做呢?

simonguo commented 6 years ago

可以通过 addRule 自定义添加校验规则, 参考示例:

const myModel = SchemaModel({
    field1: StringType().addRule((value) => {
        if(value==='root'){
          return {
            hasError: true,
            errorMessage:'不能是关键字 root'
          }
        }else if(!/^[a-zA-Z]+$/.test(value)){
          return {
            hasError: true,
            errorMessage:'只能是英文字符'
          }
        }
        return {
            hasError: false
        }
    })
});

文档: https://github.com/rsuite/rsuite-schema#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8A%A8%E6%80%81%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF

skchen28 commented 6 years ago

你这是一个字段,而我说的是两个字段之间的关联性校验

simonguo commented 6 years ago
// 把你的证件类型存在变量中

let formData = {
  certificateType: '' // '身份证' | '驾驶证' | ...;
};

const myModel = SchemaModel({
  field1: StringType().addRule(value => {
    if (formData.certificateType === '身份证') {
      // 处理你的逻辑
    }

    return {
      hasError: false
    };
  })
});
simonguo commented 6 years ago

@skchen28 改进了多字段交叉验证的处理

const schema = SchemaModel({
  password1: StringType().isRequired('This field required'),
  password2: StringType().addRule((value, data) => {
    if (value !== data.password1) {
      return false;
    }
    return true;
  }, 'The passwords are inconsistent twice')
});

schema.check({ password1: '123456', password2: 'root' });

/**
{
  password1: { hasError: false },
  password2: {
    hasError: true,
    errorMessage: 'The passwords are inconsistent twice'
  }
};
**/

https://github.com/rsuite/schema-typed#custom-verification---multi-field-cross-validation

simonguo commented 3 years ago

新增了字段的条件判断 https://github.com/rsuite/schema-typed#whencondition-schemaspec-schemadeclarationdatatype-errormsgtype--type