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

先看需求

录入信息功能,指的是根据一张动态获取的数据库表的结构,新增一条数据。
1.需要前端对输入的字段信息进行一些判断,包括:文本类型、文本长度、是否必填。
2.不同的文本类型对应不同的输入框:时间使用layui的时间选择器;长文本使用layui的文本域;其他类型使用layui的普通输入框。
3.不同字段需要对长度进行判断,需要判断是否为必填项(图中带*的就是),需要判断是否为数字类型。
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的本语法知识。

表结构

里面字段很多,主要是int 、varchar、datetime、text这几种类型。
在这里插入图片描述

最终实现的效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

封装的方法

 // 封装判断长度规则
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 = `
                    <tr>
                      <td>${data[i].field}</td>
                      <td>${data[i].type}</td>
                      <td>${data[i].nulls}</td>
                      <td>${data[i].length}</td>
                      <td>${data[i].comment}</td>
                      <td>${data[i].comment}</td>
                    </tr>`;
                    $("#tbody").append(tr);

                    // 下拉框:表信息用到的下拉框
                    let opts = `<option value="${data[i].type}">${data[i].field}</option>`;
                    $("#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 = `<i class="font-red">*</i>`;
                        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 = `
                        <div class="layui-input-block">
                            <textarea name="${data[i].field}" placeholder="请输入内容" class="layui-textarea" rows="1" maxlength="${maxlength}" lay-verify="${str_verify}"></textarea>
                        </div>`;
                    }
                    else if (data[i].type == "datetime") {
                        inputBox = `
                        <div class="layui-input-block public-time-box">
                        <input type="text" name="${data[i].field}" placeholder="请选择时间" autocomplete="off" class="layui-input"
                            id="${data[i].field}">
                       </div>`;
                        needTimeArr.push(data[i].field);

                    } else {
                        inputBox = `
                        <div class="layui-input-block">
                            <input type="text" name="${data[i].field}"  autocomplete="off"
                            placeholder="请输入" class="layui-input" lay-verify="${str_verify}"
                            lay-reqtext="${data[i].field}不能为空">
                        </div>`;
                    }


                    let items = `
                        <div class="layui-form-item flexbox">
                        <div class="label flexbox">
                            <span class="font-t" title="${str_field}">${str_nulls} ${str_field}</span>
                            <span class="font-b" title="${str_field}">${str_comment}</span>
                        </div>
                             ${inputBox} 
                        </div>`;

                    $("#addDataForm").append(items);
                    /*表单-结束 */

                }

                renderTimes(needTimeArr);//渲染所有时间选择器
                layui.form.render();//重载
                getTableData();//获取表格数据

            }

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

别人总结好的:
在这里插入图片描述

总结

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值