分类
Form 组件基于 async-validator 实现的数据验证,给 Form 设置属性 rules
,同时给需要验证的 FormItem 设置属性 prop
指向对应字段即可。
一、统一放在一个文件
组件
html:
<Form ref="refAddCityClass" :model="addCityClass" :rules="ruleAddCityClass" :label-width="100" >
<FormItem label="城市类别:" prop="className">
<Input type="text" v-model="addCityClass.className" :maxlength="15" placeholder="请输入城市类别名称" clearable/>
</FormItem>
</Form>
<Button type="primary" @click="methodAddCityClass">确认</Button>
js:
// 验证的文件,放在一个文件中统一管理
import validate from '@/utils/validate'
data () {
return {
addCityClass: {
className: ''
},
ruleAddCityClass: validate,
}
},
methods: {
methodAddCityClass() {
// 这里一定要写,只有验证通过后才会执行
this.$refs['refAddCityClass'].validate(valid => {
if (valid) {
// 如果验证通过,执行的一些操作,比如调接口等
} else {
// 如果验证不通过执行的一些操作
}
})
},
}
validate.js
const validateNameZh = (rule, value, callback) => {
if (value.trim() === '') {
return callback(new Error('请输入名称'))
} else if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(value)) {
return callback(new Error('请输入中英文数字下划线,不能输入特殊字符'))
} else {
callback()
}
}
// 这里可以继续写其他验证规则
const validate = {
className: [
{
required: true,
validator: validateNameZh,
trigger: 'blur'
}
],
// 这里可以继续写其他要验证的字段
}
export default validate
二、放在各自的组件中
组件
html:
<Form ref="refAddCityClass" :model="addCityClass" :rules="ruleAddCityClass" :label-width="100" >
<FormItem label="城市类别:" prop="className">
<Input type="text" v-model="addCityClass.className" :maxlength="15" placeholder="请输入城市类别名称" clearable/>
</FormItem>
</Form>
<Button type="primary" @click="methodAddCityClass">确认</Button>
js:
可以放在script标签引入文件的下面
const validateNameZh = (rule, value, callback) => {
if (value.trim() === '') {
return callback(new Error('请输入名称'))
} else if (!/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/.test(value)) {
return callback(new Error('请输入中英文数字下划线,不能输入特殊字符'))
} else {
callback()
}
}
data () {
return {
addCityClass: {
className: ''
},
ruleAddCityClass: {
className: [
{
required: true,
validator: validateNameZh,
trigger: 'blur'
}
],
// 这里可以继续写其他要验证的字段
}
}
},
methods: {
methodAddCityClass() {
this.$refs['refAddCityClass'].validate(valid => {
if (valid) {
// 如果验证通过,执行的一些操作,比如调接口等
} else {
// 如果验证不通过执行的一些操作
}
})
},
}
其他问题
可以给formitem单独加rules
情况:更加灵活,比如用在同一个表单,但是切换显示的表单项。
<FormItem label="默认差标金额" prop="defaultPrice" :rules="{//验证...}">
<Input type="text" v-model="formSet.defaultPrice" style="width: 200px;"/>
</FormItem>
在Modal
模态框中使用表单的话验证不生效
解决办法:使用模态框的自定义页脚,关闭按钮等,在方法调用后先进行验证,验证通过后进行其他操作,随后把模态框关闭。
html:
<Modal width="400" v-model="setModal" title="修改全局设置" :mask-closable="false">
<Form ref="refSet" :model="formSet" :rules="ruleSet" :label-width="100" >
<FormItem label="默认差标金额" prop="defaultPrice">
<Input type="text" v-model="formSet.defaultPrice" style="width: 200px;"/>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="cancel">取消</Button>
<Button type="primary" @click="ok">确认</Button>
</div>
</Modal>
js:
ok () {
this.$refs['refSet'].validate(valid => {
if (valid) {
// 在其他操作(调接口等)完成后,将模态框关闭
this.setModal = false
}
})
},
cancel () {
this.setModal = false
},
数字验证不生效
{type: 'number', message: '请输入数字', trigger: 'blur'}
上面这种验证方式是不生效的,即使生效也会出现其他问题(当不止验证数字时,同时验证不为空等)
解决办法:使用自定义验证方式
const validateNumber = (rule, value, callback) => {
if (value.trim() === '') {
return callback(new Error('不能为空'))
} else if (!/^[0-9]*$/.test(value)) {
return callback(new Error('请输入数字'))
} else {
callback()
}
}
number: [{ required: true, trigger: 'blur', validator: validateNumber }],
必填验证类型
用iview自带的表单验证select标签的时候,一直验证不通过,因为iview默认校验数据类型为String,而我的select用的value是number类型的
assetPurpose: [{
required: true,
message: '请选择资产用途',
trigger: 'change',
type:'number'
}],
string: 必须是字符串类型。这是默认类型
number: 必须是数字
boolean: 必须是布尔型的
method:必须是类型函数
regexp: 必须是ReGEXP的实例,或者是在创建新的ReGEXP时不会生成异常的字符串
integer:必须是整数.
float:必须是浮点数.
array: 必须是由Array.isArray确定的数组
object: 必须是类型对象而不是Array.isArray
enum: 枚举中必须存在值。
date: 按日期确定的值必须有效
url: 必须是URL类型。
hex: 必须是十六进制。
email:必须是电子邮件类型。