iview表单验证

分类

Form 组件基于 async-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可。

一、统一放在一个文件

组件

html:

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:

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 {
                // 如果验证不通过执行的一些操作
            }
        })
    },
}

其他问题

Modal模态框中使用表单的话验证不生效

解决办法:使用模态框的自定义页脚,关闭按钮等,在方法调用后先进行验证,验证通过后进行其他操作,随后把模态框关闭。
html:


    

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:必须是电子邮件类型。

网站导航

网站导航

你可能感兴趣的:(iview表单验证)