Appearance
表单校验配置
表单校验是基于 async-validator 封装的,主要用到 validate 函数和 rules 的配置规则。
API
validate
常用于提交表单的时候,对整个表单需校验字段进行校验,得到校验结果,使用示例如下所示:
this.$refs[formName].validate((valid, error) => {})参数说明:
valid:Boolean 类型,值为true时表示表单所有字段都校验通过,可提交表单。值为false时表示有字段没校验通过。error:Array 类型,包含校验不通过的字段。
Rules
用于设置表单每个需校验字段的校验规则,可设置每个字段的校验类型,是否必填,校验不成功的提示信息等。
type
通过 type 设置需校验字段的校验类型,使用这个,我们就可以对一些特定的字段进行校验,而不用再像以前一样写正则,做判断。使用示例如下所示:
rules: {
name: { type: 'string', required: true }
}可设置的值如下:
string:字符串类型(默认值)number:数字类型boolean:布尔类型method:函数类型regexp:正则表达式integer:整型float:双精度浮点型数字array:数组类型object:对象类型enum:枚举值date:值必须是由日期决定的有效值url:网址格式hex:16 进制数字email:电子邮箱类型any:任意类型
required
required 的属性值为 Boolean 类型,用于设置字段是否为必填项,即非空验证。
true:设置为true,表示该字段为必填项,且 label 会带红色 * 号false:默认值,表示该字段不是必填项,label 不会带红色 * 号
pattern
配置用于校验该字段的正则表达式。使用示例如下所示:
rules: {
name: { required: true, pattern: /^[a-z]+$/ }
}min
对于 string 和 array 类型,将对长度进行比较,对于 number 类型,数字不能小于 min。使用示例如下所示:
rules: {
users: { min: 2, message: '长度必须不小于 2' }
}max
对于 string 和 array 类型,将对长度进行比较,对于 number 类型,数字不能大于 max。使用示例如下所示:
rules: {
users: { max: 11, message: '长度必须不大于 11' }
}len
要验证字段的确切长度,请指定 len 属性。对于 string 和 array 类型,将对 length 属性进行比较。对于 number 类型,此属性表示该数字的精确匹配,即,它只能严格等于 len。如果 len 属性与 min 和 max 属性一起使用,则 len 优先。使用示例如下所示:
rules: {
users: { len: 2, message: '长度必须为 2' }
}trigger
通过 trigger 配置触发校验规则的方式,为 change 时,当输入框值改变即触发校验,为 blur 时则失焦后触发校验。可设置成数组 ['change', 'blur'] 两种场景都触发,默认为两种场景都触发。 如果如果仅在主动调用校验方式时触发,可设置为空数组 []。使用示例如下所示:
rules: {
users: { len: 2, message: '长度必须为 2', trigger: 'change' },
password: { len: 2, message: '长度必须为 2', trigger: ['change', 'blur'] },
nickname: { len: 10, message: '已存在重复名称', trigger: [] }
}可配置的值如下:
blur:则失焦后触发校验。change:当输入框值改变即触发校验
enum
枚举值验证,验证字段的值是否在 enum 属性配置的数组 ['admin', 'user', 'guest'] 中。例如:
rules: {
role: { type: 'enum', enum: ['admin', 'user', 'guest'] }
}whitespace
验证必填字段是否只有空格。通常将只包含空白的必填字段视为错误。若要将仅由空格组成的字符串视为错误,则可设置 whitespace 为 true ,如果没有该配置,则全空格的输入值也是有效的。
rules: {
name: { required: true, whitespace: true, message: '相对人名称不能为空' }
}fields
深层规则。如果需要验证深层对象属性,可以通过将嵌套规则分配给规则的 fields 属性来验证 object 或 array 类型的验证规则。请注意,如果不在父规则上指定 required 属性,则不在源对象上声明字段是完全有效的,并且深度验证规则将不会执行,因为没有任何可验证的对象。例如:
- object 类型:
rules: {
address: {
type: 'object', required: true, // 父规则上必须指定 required 为 true
fields: {
street: { type: 'string', required: true },
city: { type: 'string', required: true },
zip: { type: 'string', required: true, len: 8, message: 'invalid zip' }
}
},
name: { type: 'string', required: true }
}- array 类型:
rules: {
roles: {
type: 'array', required: true, len: 3,
fields: {
0: { type: 'string', required: true },
1: { type: 'string', required: true },
2: { type: 'string', required: true }
}
}
}defaultField
defaultField 属性可与 array 或 object 类型一起使用,以验证容器的所有值。它可以是包含验证规则的 object 或 array。例如:
rules: {
urls: {
type: 'array', required: true,
defaultField: { type: 'url' }
}
}transform
有时有必要在验证之前转换值,以强制或以某种方式对其进行清理。为此 transform ,向验证规则添加一个功能。在验证之前,先转换属性,然后将其重新分配给源对象,以更改该属性的值。使用场景比如:去除用户输入的空格。
rules: {
name: {
type: 'string',
required: true,
pattern: /^[a-z]+$/,
transform(value) {
return value.trim();
}
}
}messages
用于配置字段校验不成功时的提示信息,支持国际化。
- 实现此目的最简单的方法是将消息分配给规则
rules: {
name: { type: 'string', required: true, message: 'Name is required' }
}- 消息可以是任何类型,例如 jsx 格式
rules: {
name: { type: 'string', required: true, message: '<b>Name is required</b>' }
}- 消息也可以是一个函数,例如,如果使用 vue-i18n
rules: {
name: { type: 'string', required: true, message: () => this.$t( 'name is required' ) }
}validator
通过 validator 选项为某个字段进行自定义校验,校验方法中 callback 必须被调用。
如下所示,先在 methods 对象中定义一个自定义校验的方法:
// 自定义的校验 password 的方法
validatePass(rule, value, callback) {
if (!/^(?=._[a-z])(?=._[A-Z])(?=.\*\\d)[a-zA-Z\d]{8,}$/.test(value)) {
callback(new Error('最少八个字符,至少包含一个大写字母,一个小写字母和一个数字'))
} else {
callback()
}
}然后在对应的需要校验的规则中配置 validator: this.validatePass:
rules: {
password: [
{ required: true, message: '必填', trigger: 'blur' },
{ validator: this.validatePass, trigger: 'blur' }
]
}asyncValidator
通过 asyncValidator 选项为某个字段进行自定义异步校验,校验方法中 callback 必须被调用。
如下所示,先在 methods 对象中定义一个自定义的异步校验的方法:
// 自定义异步校验 password 的方法
promiseField(rule, value, callback) {
ajax({
url: 'xx',
value: value
}).then(function(data) {
callback();
}, function(error) {
callback(new Error(error))
})
}然后在对应的需要校验的规则中配置 asyncValidator: this.promiseField:
rules: {
password: [
{ required: true, message: '必填', trigger: 'blur' },
{ asyncValidator: this.promiseField, trigger: 'blur' }
]
}