element根据后台返回的数据动态加载表单及对应的验证规则

本文介绍了一个基于Vue框架的复杂表单组件实现,详细展示了如何使用Element UI库进行表单元素的创建与数据双向绑定,同时包含了各种类型输入字段的验证规则设置,如文本、数字、日期时间、下拉选择、单选、多选、文件上传等,并提供了完整的HTML、JavaScript代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdn.bootcss.com/vue/2.6.11/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>


</head>

<body>
    <div id="app">
        <el-form ref="data" :model="data" label-position="left" :rules="rules" status-icon>
            <el-form-item v-for="(item, index) in data.formList" :label="item.ENAME" :key="item.EID" status-icon
                :prop="'formList.' + index + '.VALUE'" :rules="item.RULES.formInlineVal">
                <template v-if="item.ETYPE == 1">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 2">
                    <el-input v-model.number="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 3">
                    <div class="block">
                        <el-date-picker v-model="item.VALUE" type="datetime" placeholder="选择日期时间">
                        </el-date-picker>
                    </div>
                </template>

                <template v-if="item.ETYPE == 4">
                    <el-select v-model="item.VALUE" placeholder="请选择">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                    </el-select>
                </template>

                <template v-if="item.ETYPE == 5">
                    <el-radio-group v-model="item.VALUE">
                        <el-radio label="线上品牌商赞助"></el-radio>
                        <el-radio label="线下场地免费"></el-radio>
                    </el-radio-group>
                </template>

                <template v-if="item.ETYPE == 6">
                    <el-checkbox-group v-model="item.VALUE">
                        <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
                        <el-checkbox label="地推活动" name="type"></el-checkbox>
                        <el-checkbox label="线下主题活动" name="type"></el-checkbox>
                        <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
                    </el-checkbox-group>
                </template>

                <template v-if="item.ETYPE == 9">
                    <el-input v-model="item.VALUE" type="textarea" placeholder="请输入">
                    </el-input>
                </template>

                <template v-if="item.ETYPE == 10">
                    <el-input type="password" v-model="item.VALUE" autocomplete="off"></el-input>
                </template>

                <template v-if="item.ETYPE == 16">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 36">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 17">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 18">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 19">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 20">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 21">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 23">
                    <el-input v-model="item.VALUE"></el-input>
                </template>

                <template v-if="item.ETYPE == 7">
                    
                    <el-upload class="upload-demo" ref="upload" :action="saveMeals" :file-list="item.VALUE"
                        :on-remove="handleRemove" :before-upload="beforeUpload" name="meals" accept="file/*"
                        :on-change="fileChange" :on-success="handleUploadSuccess" :auto-upload="false">
                        <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
                        <el-button size="medium" type="success" @click="submitUpload(item.VALUE)">
                            <i class="el-icon-upload el-icon--right"></i>上传到服务器
                        </el-button>
                    </el-upload>
                </template>

            </el-form-item>

            <el-form-item style="text-align: center;margin-top: 10px;">
                <el-button type="primary" @click="submitForm('data')">提交</el-button>
                <el-button @click="resetForm('data')">重置</el-button>
            </el-form-item>
        </el-form>
    </div>

    <script>
        new Vue({
            el: '#app',
            data() {

                //密码
                var validatePass = (rule, value, callback) => {
                    if (value === '') {
                        callback(new Error('请输入密码'));
                    } else {
                        callback();
                    }
                };
                //手机号验证
                var checkCellPhone = (rule, value, callback) => {
                    if (!value) {
                        return callback(new Error('手机号不能为空'));
                    } else {
                        const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
                        if (reg.test(value)) {
                            callback();
                        } else {
                            return callback(new Error('请输入正确的手机号'));
                        }
                    }
                };
                //座机号验证
                var checkTelePhone = (rule, value, callback) => {
                    if (!value) {
                        return callback(new Error('座机号不能为空'));
                    } else {
                        const reg = /^(\d{3,4}-)?\d{7,8}$/;//座机和传真格式是一样的:区号-号码
                        if (reg.test(value)) {
                            callback();
                        } else {
                            return callback(new Error('请输入正确的座机号'));
                        }
                    }
                };

                //金额验证
                var checkPrice = (rule, value, callback) => {


                    if (!value) {
                        return callback(new Error('金额不能为空'));
                    } else {
                        const rgx = /(^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d{1,2})?$)/;
                        if (value.match(rgx) == null) {
                            return callback(new Error('请检查输入格式,不能为空,且最多两位小数'))
                        } else {
                            callback();
                        }
                    }
                };

                //身份证号验证
                var checkID = (rule, value, callback) => {
                    if (!value) {
                        return callback(new Error('身份证号不能为空'));
                    } else {
                        const reg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[0-2])(([0-2][1-9])|10|20|30|31)\d{3}(\d|X|x)$/;
                        if (reg.test(value)) {
                            callback();
                        } else {
                            return callback(new Error('请输入正确的身份证号'));
                        }
                    }
                };

                //IP验证
                var checkCodeIp = (rule, value, callback) => {
                    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
                    if (reg.test(value)) {
                        callback();
                    } else {
                        return callback(new Error('输入格式不合法!'));
                    }
                };
                return {
                    data: {
                        formList: [],    //存放表单数据
                        myFileList: [],
                    },
                    rules: {    //表单校验规则
                        text: [
                            { required: 1, message: '请输入名称', trigger: 'blur' },
                            // { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
                        ],
                        number: [
                            { required: 1, message: '数字不能为空' },
                            { type: 'number', message: '必须为数字值' }
                        ],
                        datetime: [
                            { type: 'date', required: 1, message: '请选择时间', trigger: 'change' }
                        ],
                        select: [
                            { required: 1, message: '请选择', trigger: 'change' }
                        ],
                        radio: [
                            { required: 1, message: '请选择', trigger: 'change' }
                        ],
                        checkbox: [
                            { type: 'array', required: 1, message: '请至少选择一个', trigger: 'change' }
                        ],
                        textarea: [
                            { required: 1, message: '请输入内容', trigger: 'blur' }
                        ],
                        password: [
                            { required: 1, validator: validatePass, trigger: 'blur' }
                        ],
                        curruser: [
                            { required: 1, message: '请输入', trigger: 'blur' },
                        ],
                        currTenant: [
                            { required: 1, message: '请输入', trigger: 'blur' },
                        ],
                        email: [
                            { required: 1, message: '请输入邮箱地址', trigger: 'blur' },
                            { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
                        ],
                        cellphone: [
                            { required: 1, trigger: 'blur', validator: checkCellPhone }
                        ],
                        telephone: [
                            { required: 1, trigger: 'blur', validator: checkTelePhone }
                        ],
                        money: [
                            { required: 1, trigger: ['blur', 'change'], validator: checkPrice },
                        ],
                        ID: [
                            { required: 1, trigger: ['blur', 'change'], validator: checkID },
                        ],
                        IP: [
                            { required: 1, message: 'IP不能为空', trigger: 'blur' },
                            { validator: checkCodeIp, trigger: 'blur' }
                        ],
                        file: [
                            { required: 1, message: '请选择上传', trigger: 'change' }
                        ]

                    }
                }
            },
            methods: {
                init: function () {     //初始化加载数据
                    var that = this;
                    $.ajax({
                        type: "get",
                        url: "",
                        cache: false,
                        async: false,
                        dataType: "JSON",
                        success: function (data) {

                        },
                        error: function (data) {

                        }
                    });

                    var temp = [{ 'ENAME': '申请人', 'EID': 'SHENQINGREN', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '1' },
                    { 'ENAME': '申请原因', 'EID': 'SHENQINGYUANYIN', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '2' },
                    { 'ENAME': '计划开始时间', 'EID': 'STARTTIME', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '3' },
                    { 'ENAME': '计划结束时间', 'EID': 'ENDTIME', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '3' },
                    { 'ENAME': '下拉框', 'EID': 'SELECT', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '4' },
                    { 'ENAME': '单选', 'EID': 'RADIO', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '5' },
                    { 'ENAME': '多选', 'EID': 'CHECKBOX', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '6' },
                    { 'ENAME': '多行输入', 'EID': 'TEXTAREA', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '9' },
                    { 'ENAME': '密码', 'EID': 'PASSWORD', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '10' },
                    { 'ENAME': '当前用户', 'EID': 'CURRUSRE', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '16' },
                    { 'ENAME': '当前租户', 'EID': 'CURRTENANT', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '36' },
                    { 'ENAME': '邮箱', 'EID': 'EMAIL', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '17' },
                    { 'ENAME': '手机号', 'EID': 'CELLPHONE', 'DICT_ID': '', 'REQUIRED': '0', 'ETYPE': '18' },
                    { 'ENAME': '座机号', 'EID': 'TELEPHONE', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '19' },
                    { 'ENAME': '金额', 'EID': 'MONEY', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '20' },
                    { 'ENAME': '身份证号', 'EID': 'ID', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '21' },
                    { 'ENAME': 'IP地址', 'EID': 'IP', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '23' },
                    { 'ENAME': '文件上传', 'EID': 'FILE', 'DICT_ID': '', 'REQUIRED': '1', 'ETYPE': '7' },
                    ];

                    for (var i = 0; i < temp.length; i++) {     //对初始数据加工,挂上对应rule
                        switch (temp[i].ETYPE) {
                            case '1':   //text
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'text');
                                break;
                            case '2': //number
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'number');
                                break;
                            case '3': //datetime
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'datetime');
                                break;
                            case '4': //select
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'select');
                                break;
                            case '5': //radio
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'radio');
                                break;
                            case '6': //checkbox
                                temp[i].VALUE = [];
                                that.addRules(temp[i], 'checkbox');
                                break;
                            case '9': //textarea
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'textarea');
                                break;
                            case '10': //password
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'password');
                                break;
                            case '16': //curruser
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'curruser');
                                break;
                            case '36': //currTenant
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'currTenant');
                                break;
                            case '17': //email
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'email');
                                break;
                            case '18': //cellphone
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'cellphone');
                                break;
                            case '19': //telephone
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'telephone');
                                break;
                            case '20': //money
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'money');
                                break;
                            case '21': //ID
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'ID');
                                break;
                            case '23': //IP
                                temp[i].VALUE = '';
                                that.addRules(temp[i], 'IP');
                                break;
                            case '7': //file
                                debugger
                                temp[i].VALUE = [];
                                temp[i].saveMeals = '';
                                that.addRules(temp[i], 'file');
                                break;
                        }
                    }
                    that.data.formList = temp;
                    console.log(that.data.formList);

                },
                addRules: function (obj, type) {    //组装rules数据格式
                    var that = this;
                    var arr = [];
                    obj.REQUIRED = obj.REQUIRED ^ 1;    //01互转
                    $.each(that.rules[type], function (i, val) {
                        val.required = obj.REQUIRED
                        arr.push(val);
                    });
                    obj.RULES = new Object();
                    var formInlineVal = arr;
                    obj.RULES.formInlineVal = formInlineVal;
                },
                submitForm(formName) {  //点击提交按钮调用
                    this.$refs[formName].validate((valid) => {
                        if (valid) {
                            alert('submit!');
                        } else {
                            console.log('error submit!!');
                            return false;
                        }
                    });
                },
                resetForm(formName) {   //点击重置按钮 清空表单信息
                    this.$refs[formName].resetFields();
                },
                //上传文件相关方法
                beforeUpload(file) {//文件上传前的钩子函数
                    debugger
                    console.log('file>>>>>');
                    console.log(file);

                },
                submitUpload(val) {//上传
                    if (this.myFileList == null || this.myFileList == '') {       //判断当前是否有上传文件
                        this.$message({ type: 'error', message: "请选择文件!" })
                        return false;
                    } else {
                        console.log('this.myFileList>>>>>');
                        console.log(this.myFileList);

                        var fileData = this.myFileList[0];
                        val.push(fileData);//VALUE字段灌入上传的文件信息数据
                        console.log('上传服务器>>>>');
                        console.log(this.data.formList);
                        this.$refs.upload.submit();

                        $.ajax({
                            type: "post",
                            url: "",
                            data: fileData,
                            contentType: false,//这里不能少
                            dataType: 'json',
                            success: function (data) {

                            },
                            error: function (error) {
                            }
                        });
                    }
                },
                // 上传成功的钩子函数
                handleUploadSuccess(response, file, fileList) {
                    this.$refs.upload.clearFiles();//移除文件,防止重复上传
                    this.$message(response);//显示上传结果
                },

                handleRemove() {//移除文件
                    this.myFileList = [];
                },
                fileChange(file, fileList) {//限制只能选中一个文件
                    this.myFileList = fileList.slice(-1); //获取当前上传文件数据
                }
            },
            mounted: function () {
                this.init();    //初始化加载表单数据
            }
        })
    </script>
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值