美文网首页
vue+element 表单验证问题

vue+element 表单验证问题

作者: w_wx_x | 来源:发表于2019-12-25 11:56 被阅读0次

常规表单验证、自定义表单验证、动态增删表单验证

1.常规表单验证
image.png
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
    <el-form-item label="活动名称" prop="name">
        <el-input v-model="ruleForm.name"></el-input>
    </el-form-item>
    <el-form-item label="活动区域" prop="region">
        <el-select v-model="ruleForm.region" placeholder="请选择活动区域">
            <el-option label="区域一" value="shanghai"></el-option>
            <el-option label="区域二" value="beijing"></el-option>
        </el-select>
    </el-form-item>
    <el-form-item label="活动时间" required>
        <el-col :span="11">
            <el-form-item prop="date1">
                <el-date-picker type="date" placeholder="选择日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
            </el-form-item>
        </el-col>
        <el-col class="line" :span="2">-</el-col>
        <el-col :span="11">
            <el-form-item prop="date2">
                <el-time-picker placeholder="选择时间" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
            </el-form-item>
        </el-col>
    </el-form-item>
    <el-form-item label="即时配送" prop="delivery">
        <el-switch v-model="ruleForm.delivery"></el-switch>
    </el-form-item>
    <el-form-item label="活动性质" prop="type">
        <el-checkbox-group v-model="ruleForm.type">
            <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>
    </el-form-item>
    <el-form-item label="特殊资源" prop="resource">
        <el-radio-group v-model="ruleForm.resource">
            <el-radio label="线上品牌商赞助"></el-radio>
            <el-radio label="线下场地免费"></el-radio>
        </el-radio-group>
    </el-form-item>
    <el-form-item label="活动形式" prop="desc">
        <el-input type="textarea" v-model="ruleForm.desc"></el-input>
    </el-form-item>
    <el-form-item>
        <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
    </el-form-item>
</el-form>
<script>
export default {
    data() {
    return {
        ruleForm: {
        name: '',
        region: '',
        date1: '',
        date2: '',
        delivery: false,
        type: [],
        resource: '',
        desc: ''
        },
        rules: {
            name: [
                { required: true, message: '请输入活动名称', trigger: 'blur' },
                { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
            ],
            region: [
                { required: true, message: '请选择活动区域', trigger: 'change' }
            ],
            date1: [
                { type: 'date', required: true, message: '请选择日期', trigger: 'change' }
            ],
            date2: [
                { type: 'date', required: true, message: '请选择时间', trigger: 'change' }
            ],
            type: [
                { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
            ],
            resource: [
                { required: true, message: '请选择活动资源', trigger: 'change' }
            ],
            desc: [
                { required: true, message: '请填写活动形式', trigger: 'blur' }
            ]
        }
    };
    },
    methods: {
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    alert('submit!');
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        resetForm(formName) {
            this.$refs[formName].resetFields();
        }
    }
}
</script>
2.自定义表单验证
image.png
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
    <el-form-item label="密码" prop="pass">
        <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
    </el-form-item>
    <el-form-item label="确认密码" prop="checkPass">
        <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
    </el-form-item>
    <el-form-item label="年龄" prop="age">
        <el-input v-model.number="ruleForm.age"></el-input>
    </el-form-item>
    <el-form-item>
        <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
    </el-form-item>
</el-form>
<script>
export default {
    data() {
        var checkAge = (rule, value, callback) => {
            if (!value) {
                return callback(new Error('年龄不能为空'));
            }
            setTimeout(() => {
                if (!Number.isInteger(value)) {
                    callback(new Error('请输入数字值'));
                } else {
                    if (value < 18) {
                        callback(new Error('必须年满18岁'));
                    } else {
                        callback();
                    }
                }
            }, 1000);
        };
        var validatePass = (rule, value, callback) => {
            if (value === '') {
                callback(new Error('请输入密码'));
            } else {
                if (this.ruleForm.checkPass !== '') {
                    this.$refs.ruleForm.validateField('checkPass');
                }
                callback();
            }
        };
        var validatePass2 = (rule, value, callback) => {
            if (value === '') {
                callback(new Error('请再次输入密码'));
            } else if (value !== this.ruleForm.pass) {
                callback(new Error('两次输入密码不一致!'));
            } else {
                callback();
            }
        };
        return {
            ruleForm: {
                pass: '',
                checkPass: '',
                age: ''
            },
            rules: {
                pass: [
                    { validator: validatePass, trigger: 'blur' }
                ],
                checkPass: [
                    { validator: validatePass2, trigger: 'blur' }
                ],
                age: [
                    { validator: checkAge, trigger: 'blur' }
                ]
            }
        };
    },
    methods: {
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    alert('submit!');
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        resetForm(formName) {
            this.$refs[formName].resetFields();
        }
    }
}
</script>
3.动态增减

a.表单


image.png
<el-form :model="storeForm" :rules="rules" ref="storeForm" label-width="100px">
    <el-form-item label="联系电话:" required>
        <el-row :gutter="20" class="tel-wrapper">
            <el-col :span="6" v-for="(contact,index) in storeForm.storeContacts" :key="contact.id">
                <el-form-item :prop="'storeContacts.' + index+ '.mobile'" :rules="rules.mobile">
                    <el-input v-model="contact.mobile" type="number">
                        <el-button slot="append" :icon="index == 0 ? 'el-icon-plus' : 'el-icon-delete'" @click="telInputHandler(index)"></el-button>
                    </el-input>
                </el-form-item>
            </el-col>
        </el-row>
    </el-form-item>
    <el-form-item>
        <el-button type="primary" @click="submitForm('storeForm')">提交</el-button>
        <el-button @click="resetForm('storeForm')">重置</el-button>
    </el-form-item>
</el-form>
<script>
import { isMobile } from '@/util/validate'
export default {
    data() {
        return {
            storeForm: {
                storeContacts: []
            },
            rules: {
                mobile: { validator: mobile, trigger: 'blur' }
            }
        };
    },
    methods: {
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    alert('submit!');
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        resetForm(formName) {
            this.$refs[formName].resetFields();
        }
    }
}
</script>
// util/validate.js
export function isMobile (rule:any, value:any, callback:any) {
    if (!value) {
        callback(new Error('请输入手机号'))
    } else {
        if (!(/^1[3456789]\d{9}$/.test(value))) {
            callback(new Error('手机号码有误'))
        } else {
            callback()
        }
    }
}

b.表格


image.png
<el-form ref="cardForm" :model="cardForm" :rules="rules">
    <el-row>
        <el-col :span="12">
            <el-form-item label="会员卡名称:" prop="name" label-width="125px">
                <el-input
                    v-model="cardForm.name"
                    autocomplete="off"
                    maxlength="30"
                    placeholder="输入会员卡名称"
                ></el-input>
            </el-form-item>
        </el-col>
        <el-col :span="12">
            <el-form-item label="售价:" prop="price" label-width="125px">
                <el-input v-model="cardForm.price" autocomplete="off" type="number" min="0" max="99999">
                    <template slot="append">元</template>
                </el-input>
            </el-form-item>
        </el-col>
    </el-row>
    <div style="margin-top:7px">
        <p class="sub-title">会员卡内容</p>
        <el-table
            border
            :data="cardForm.contents"
            tooltip-effect="dark"
            style="width: 100%"
            max-height="150"
            class="mb-10"
        >
            <el-table-column label="类型" align="center">
                <template slot-scope="scope">
                    <el-form-item :prop="'contents.' + scope.$index + '.type'" :rules="rules.type">
                        <el-select
                            v-model="scope.row.type"
                            placeholder="请选择"
                            @change="typeChanged($event,scope.row)"
                        >
                            <el-option
                                v-for="item in categoryOptions"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value"
                            ></el-option>
                        </el-select>
                    </el-form-item>
                </template>
            </el-table-column>
            <el-table-column label="内容" align="center">
                <template slot-scope="scope">
                    <span v-if="scope.row.type == 5">现金</span>
                    <el-form-item
                        v-if="scope.row.type == 1"
                        :prop="'contents.' + scope.$index + '.itemId'"
                        :rules="rules.project"
                    >
                        <el-select
                            v-model="scope.row.itemId"
                            filterable
                            placeholder="请选择项目"
                            @change="nameChanged($event,scope.row)"
                        >
                            <el-option
                                v-for="item in projectList"
                                :key="item.id"
                                :label="item.name"
                                :value="item.id"
                            ></el-option>
                        </el-select>
                    </el-form-item>
                </template>
            </el-table-column>
            <el-table-column label="数量/金额" align="center">
                <template slot-scope="scope">
                    <el-form-item :prop="'contents.' + scope.$index + '.amount'" :rules="rules.amount">
                        <el-input v-model="scope.row.amount"></el-input>
                    </el-form-item>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center">
                <template slot-scope="scope">
                    <el-button type="text" icon="el-icon-delete" @click="delRow(scope.row)"></el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-button class="add-btn" icon="el-icon-plus" @click="addRow()">继续添加</el-button>
    </div>
    <el-form-item>
        <el-button type="primary" @click="submitForm('cardForm')">提交</el-button>
        <el-button @click="resetForm('cardForm')">重置</el-button>
    </el-form-item>
</el-form>
<script>
import { isMobile } from '@/util/validate'
export default {
    data() {
        return {
            cardForm: {
                name: '',
                price: '',
                contents: [{}]
            },
            rules: {
                name: { required: true, message: "请输入会员卡名称", trigger: "blur" },
                price: { required: true, message: "请输入售价", trigger: "blur" },
                type: { required: true, message: "请选择类型", trigger: "blur" },
                project: { required: true, message: "请选择项目", trigger: "blur" },
                amount: { required: true, message: "请输入数量", trigger: "blur" }
            }
        };
    },
    methods: {
        addRow () {
            let item: any = {}
            this.cardForm.contents.push(item)
        }
       delRow (row: any) {
            let tableData = this.cardForm.contents
            if (tableData.length === 1) {
                return
            }
            for (var i = 0; i < tableData.length; i++) {
                if (tableData[i] === row) {
                    tableData.splice(i, 1)
                }
            }
        }
        submitForm(formName) {
            this.$refs[formName].validate((valid) => {
                if (valid) {
                    alert('submit!');
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        resetForm(formName) {
            this.$refs[formName].resetFields();
        }
    }
}
</script>

相关文章

网友评论

      本文标题:vue+element 表单验证问题

      本文链接:https://www.haomeiwen.com/subject/vmzqoctx.html