资讯专栏INFORMATION COLUMN

avalon2 非必填项的表单验证规则

Wuv1Up / 2299人阅读

摘要:场景描述某表单中有一个邮箱的输入框,但是为非必填项,我们期望的结果不填写可以验证通过如果填写了邮箱验证邮箱格式代码如下全部通过备用邮箱非必填提交未填写邮箱运行结果没有达到期望结果,如下图方案重写验证规则官方有示例,可以自己重写一个验

场景描述
某表单中有一个邮箱的输入框,但是为非必填项,我们期望的结果
1. 不填写可以验证通过
1. 如果填写了邮箱,验证邮箱格式

代码如下


未填写邮箱
【运行结果】没有达到期望结果,如下图

方案1:重写验证规则
官方有示例,可以自己重写一个验证规则

代码如下


未填写邮箱
【运行结果】达到期望结果,如下图

avalon内置验证规则重写,如下

function isRegExp(value) {
    return avalon.type(value) === "regexp"
}
var rmail = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/i
var rurl = /^(ftp|http|https)://(w+:{0,1}w*@)?(S+)(:[0-9]+)?(/|/([w#!:.?+=&%@!-/]))?$/
function isCorrectDate(value) {
    if (typeof value === "string" && value) { //是字符串但不能是空字符
        var arr = value.split("-") //可以被-切成3份,并且第1个是4个字符
        if (arr.length === 3 && arr[0].length === 4) {
            var year = ~~arr[0] //全部转换为非负整数
            var month = ~~arr[1] - 1
            var date = ~~arr[2]
            var d = new Date(year, month, date)
            return d.getFullYear() === year && d.getMonth() === month && d.getDate() === date
        }
    }
    return false
}
avalon.shadowCopy(avalon.validators, {
    pattern: {
        message: "必须匹配{{pattern}}这样的格式",
        get: function (value, field, next) {
            var elem = field.dom 
            var data = field.data
            if (!isRegExp(data.pattern)) {
                var h5pattern = elem.getAttribute("pattern")
                data.pattern = new RegExp("^(?:" + h5pattern + ")$")
            }
            next(value === "" || data.pattern.test(value))
            return value
        }
    },
    digits: {
        message: "必须整数",
        get: function (value, field, next) {//整数
            next(value === "" || /^-?d+$/.test(value))
            return value
        }
    },
    number: {
        message: "必须数字",
        get: function (value, field, next) {//数值
            next(value === "" || isFinite(value))
            return value
        }
    },
    date: {
        message: "日期格式不正确",
        get: function (value, field, next) {
            var data = field.data
            if (isRegExp(data.date)) {
                next(value === "" || data.date.test(value))
            } else {
                next(value === "" || isCorrectDate(value))
            }
            return value
        }
    },
    url: {
        message: "URL格式不正确",
        get: function (value, field, next) {
            next(value === "" || rurl.test(value))
            return value
        }
    },
    email: {
        message: "email格式不正确",
        get: function (value, field, next) {
            next(value === "" || rmail.test(value))
            return value
        }
    },
    minlength: {
        message: "最少输入{{minlength}}个字",
        get: function (value, field, next) {
            var num = parseInt(field.data.minlength, 10)
            next(value === "" || (value.length >= num))
            return value
        }
    },
    min: {
        message: "输入值不能小于{{min}}",
        get: function (value, field, next) {
            var num = parseInt(field.data.min, 10)
            next(value === "" || (parseFloat(value) >= num))
            return value
        }
    },
    max: {
        message: "输入值不能大于{{max}}",
        get: function (value, field, next) {
            var num = parseInt(field.data.max, 10)
            next(value === "" || (parseFloat(value) <= num))
            return value
        }
    },
    chs: {
        message: "必须是中文字符",
        get: function (value, field, next) {
            next(value === "" || /^[u4e00-u9fa5]+$/.test(value))
            return value
        }
    }
})
方案2:修改源码中addField方法
如果不想重写验证规则
修改源码 avalon/src/directives/duplex/addValidateField.js
添加2行代码,打包
运行后结果达到预期
if (rules["required"] === undefined || rules["required"] === false)
    field.norequired = true;

如下图

说明:

这2行代码是指 在"ms-rules"中没有配置必填项"required"规则或"required"设置为false时,
设置该field为非必填,field.norequired为true

在源码 avalon/src/directives/duplex/addValidateField.js  中有这么一段代码
                if (field.norequired && value === "") {
                    a = true
                }

如下图红框

此方案我自测是没问题的,但不知是否全面,希望avalon的后续版本会考虑此情况
欢迎指正

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80296.html

相关文章

  • 【容器实例 Cube】创建详解:快速创建教程

    摘要:创建详解通过上面的快速创建我们接下来将通过上面的例子来进行创建操作中的详细设置说明。高阶设置高阶设置中将针对容器进行详细的参数设置。挂载路径卷名称注意如没有创建卷设置,在挂载卷中将选择不到具体的卷名称,请先创建卷设置。快速创建快速创建Cube实例点击Cube的创建按钮进入创建页面,为你的容器组起一个名字;选择一个仓库内的镜像,这里快速创建我选择的UCloud镜像仓库nginx镜像1.17.1...

    Tecode 评论0 收藏0
  • Vue_VueValidator

    摘要:验证结果会保存在组建实例的属性下。表单整体校验结果和单个字段校验结果。邮政编码是必填项对象字面量对象字面量语法适合需要额外参数的校验器。如限制输入长度的校验器需要说明限制长度多少。这样可以用来动态绑定校验规则。例如重复密码功能。 Vue-validator 是Vue的表单验证插件 Vue版本:1.0.24Vue-validator版本:2.1.3 基本使用 ...

    Baoyuan 评论0 收藏0
  • element-ui设置下拉选择切换必填必填

    摘要:需求默认都是必选下拉选择的时候选择必填,活动名称为必填,需要校验和显示选择非必填,活动名称不做校验,隐藏初始校验规则经测试,网上其他的方式都没有实现需求,动态切换中的没有作用因为按照以下的写法的话,在组件初始化后校验规则就定型了,切换也没 ➢ 需求 默认都是必选 下拉选择的时候 选择必填,活动名称为必填,需要校验和显示* 选择非必填,活动名称不做校验,隐藏* showImg(https...

    junbaor 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<