layui踩坑日常-实现动态生成表单自定义验证规则

先看需求

录入信息功能,指的是根据一张动态获取的数据库表的结构,新增一条数据。
1.需要前端对输入的字段信息进行一些判断,包括:文本类型、文本长度、是否必填。
2.不同的文本类型对应不同的输入框:时间使用layui的时间选择器;长文本使用layui的文本域;其他类型使用layui的普通输入框。
3.不同字段需要对长度进行判断,需要判断是否为必填项(图中带*的就是),需要判断是否为数字类型。
layui踩坑日常-实现动态生成表单自定义验证规则_第1张图片

表结构

里面字段很多,主要是int 、varchar、datetime、text这几种类型。
layui踩坑日常-实现动态生成表单自定义验证规则_第2张图片

最终实现的效果

layui踩坑日常-实现动态生成表单自定义验证规则_第3张图片
layui踩坑日常-实现动态生成表单自定义验证规则_第4张图片
layui踩坑日常-实现动态生成表单自定义验证规则_第5张图片
layui踩坑日常-实现动态生成表单自定义验证规则_第6张图片
layui踩坑日常-实现动态生成表单自定义验证规则_第7张图片

封装的方法

 // 封装判断长度规则
function setVerify(fieldName, num) {
    let l = parseInt(num);
    //  方法1
    // let obj = {};
    // obj[fieldName] = function (value) {
    //     if (value.length > l) {
    //         return `${fieldName}不能超过${l}个字符`;
    //     }
    // },
    //     layui.form.verify(obj);
    //  方法2
    layui.form.verify(
        {
            [fieldName]: function (value) {
                if (value.length > l) {
                    return `${fieldName}不能超过${l}个字符`;
                }
            }
        }
    );
}

 // 渲染所有时间选择器
function renderTimes(arr) {
    if (arr.length > 0) {
        for (let i = 0; i < arr.length; i++) {
            renderTime(`#${arr[i]}`, 'date', '', '');
        }
    }
}

使用位置

            if (res.code == 200) {
                let data = res.obj;
                console.log("基本数据:");
                console.log(data);
                let needTimeArr = [];//需要实例化时间选择器的字段
                for (let i = 0; i < data.length; i++) {
                    // 表格:表结构里的表格
                    if (data[i].nulls == "YES") {
                        data[i].nulls = "否"
                    } else {
                        data[i].nulls = "是"
                    };

                    let tr = `
                    
                      ${data[i].field}
                      ${data[i].type}
                      ${data[i].nulls}
                      ${data[i].length}
                      ${data[i].comment}
                      ${data[i].comment}
                    `;
                    $("#tbody").append(tr);

                    // 下拉框:表信息用到的下拉框
                    let opts = `">${data[i].field}`;
                    $("#field").append(opts);

                    // 表头:表信息layui表格的表头
                    let obj = {
                        field: data[i].field,
                        title: data[i].comment,
                    }
                    if (obj.title == "") { obj.title = obj.field }
                    cols_table.push(obj);

                    /*表单-开始 */
                    // 表单:录入数据的表单结构
                    let str_nulls = "";//星星*
                    let str_verify = "";//判断规则
                    let str_field = "";//字段名称
                    let str_comment = "";//字段描述
                    let maxlength = "";//文本域的最大长度
                    let inputBox = "";//输入框盒子


                    str_field = `${data[i].field}`;
                    str_comment = `${data[i].comment}`;
                    //判断是否为必填
                    if (data[i].nulls == "是") {
                        str_nulls = `*`;
                        str_verify = `required`;
                    }

                    //判断是否有字段描述
                    if (str_comment == "") {
                        str_comment = str_field;
                    }

                    //判断数据类型
                    if (data[i].type == "int" || data[i].type == "tinyint" || data[i].type == "tinyint" || data[i].type == "bigint" || data[i].type == "double") {

                        str_verify = str_verify + "|" + "number";//数字规则
                        str_verify = str_verify + "|" + data[i].field;//长度规则
                        setVerify(data[i].field, data[i].length);//新建规则,规则名字就是字段名

                    }
                    else if (data[i].type == "text" || data[i].type == "longtext") {

                        maxlength = data[i].length;//文本域最大长度

                    } else {

                        str_verify = str_verify + "|" + data[i].field;//长度规则
                        setVerify(data[i].field, data[i].length);//新建规则,规则名字就是字段名

                    }

                    // 匹配输入框盒子
                    if (data[i].type == "text" || data[i].type == "longtext") {
                        inputBox = `
                        
`
; } else if (data[i].type == "datetime") { inputBox = `
${data[i].field}" placeholder="请选择时间" autocomplete="off" class="layui-input" id="${data[i].field}">
`
; needTimeArr.push(data[i].field); } else { inputBox = `
${data[i].field}" autocomplete="off" placeholder="请输入" class="layui-input" lay-verify="${str_verify}" lay-reqtext="${data[i].field}不能为空">
`
; } let items = `
${str_field}">${str_nulls} ${str_field} ${str_field}">${str_comment}
${inputBox}
`
; $("#addDataForm").append(items); /*表单-结束 */ } renderTimes(needTimeArr);//渲染所有时间选择器 layui.form.render();//重载 getTableData();//获取表格数据 }

功能核心 : lay-verify=“验证规则名称”

别人总结好的:
layui踩坑日常-实现动态生成表单自定义验证规则_第8张图片

总结

1.分析需求,对不同的字段进行判断,执行不同的验证规则。
2.动态生成不同验证规则,规则名称以字段名命名。
3.封装方法,减轻痛苦。

你可能感兴趣的:(JavaScript)