vue结合element的form表单校验

vue结合element的form表单校验

在这里插入图片描述

<template>
     <div>
        <el-form :model="completedForm" :rules="rules" ref="completedForm" label-width="100px" class="demo-completedForm">
            <el-col>
                <el-form-item label="活动名称" prop="name">
                     <el-input v-model="completedForm.name" style="width: 30%;"></el-input>
                </el-form-item>
            </el-col>
            <el-col>
                <el-form-item label="活动区域" prop="region">
                     <el-select v-model="completedForm.region" placeholder="请选择活动区域">
                               <el-option 
                                      v-for="(item,index) in dataList"
                                      :key="index"
                                      :label="item.label"
                                      :value="item.value"
                               ></el-option>
                     </el-select>
               </el-form-item>
            </el-col>
            <el-col>
                <el-form-item label="活动时间" prop="time">
                    <el-date-picker
                            v-model="completedForm.time"
                            type="datetimerange"
                            range-separator="至"
                            start-placeholder="开始时间"
                            end-placeholder="结束时间"
                            :default-time="['00:00:00', '23:59:59']"
                            :picker-options="pickerOptions"
                            key="daterange"
                            value-format="yyyy-MM-dd HH:mm:ss"
                     >
                     </el-date-picker>
                </el-form-item>
            </el-col>
            <el-col>
                <el-form-item label="活动性质" prop="type">
                    <el-checkbox-group v-model="completedForm.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-col>
            <el-col>
                <el-form-item label="特殊资源" prop="resource">
                     <el-radio-group v-model="completedForm.resource">
                           <el-radio label="线上品牌商赞助"></el-radio>
                           <el-radio label="线下场地免费"></el-radio>
                     </el-radio-group>
                </el-form-item>
            </el-col>
            <el-col>
                <el-form-item label="活动形式" prop="desc">
                     <el-input type="textarea" v-model="completedForm.desc" style="width: 30%;"></el-input>
                </el-form-item>
            </el-col>
            <el-col>
                <el-form-item>
                    <el-button type="primary" @click="submitForm()">创建</el-button>
                    <el-button @click="resetForm()">重置</el-button>
                </el-form-item>
            </el-col>
        </el-form>
     </div>
</template>
<script>
export default {
      data(){
             return {
                dataList:[
                     {label:'北京',value:'01'},
                     {label:'成都',value:'02'},
                     {label:'上海',value:'03'},
                     {label:'广州',value:'04'},
                     {label:'深圳',value:'05'},
                ],
                choiceDate: null,
                pickerOptions: {
                    onPick: ({ maxDate, minDate }) => {
                        // 把选择的第一个日期赋值给一个变量。
                        this.choiceDate = minDate.getTime()
                        // 如何你选择了两个日期了,就把那个变量置空
                        if (maxDate) this.choiceDate = ''
                    },
                    disabledDate: time => {
                            let nowTime=new Date();
                            let year=nowTime.getFullYear();
                            let month=nowTime.getMonth()+1;
                            let day=nowTime.getDate();
                            let now=`${year}-${month}-${day} 23:59:59`;
                            let mynow=new Date(now).getTime();
                            // 如何选择了一个日期
                            if (this.choiceDate) {
                                // 10天的时间戳
                                const date = 9 * 24 * 3600 * 1000
                                // 当前日期 - date = 10天之前
                                const minTime = this.choiceDate - date
                                // 当前日期 + date = 10天之后
                                const maxTime = this.choiceDate + date
                                return (
                                    time.getTime() < minTime ||
                                    time.getTime() > maxTime ||
                                    // 限制不能选择今天及以后
                                    time.getTime() >mynow
                                )
                            } else {
                                // 如果没有选择日期,就要限制不能选择今天及以后
                                return time.getTime() > mynow
                            }
                    }
                },
                completedForm: {
                    name: '',
                    region: '',
                    time:[],
                    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' }
                    ],
                    type: [
                        { type: 'array', required: true, message: '请至少选择一个活动性质', trigger: 'change' }
                    ],
                    resource: [
                        { required: true, message: '请选择活动资源', trigger: 'change' }
                    ],
                    desc: [
                        { required: true, message: '请填写活动形式', trigger: 'blur' }
                    ],
                    time:[
                        {
                            required: true, 
                            trigger: 'change',
                            validator:(rule,value,callback)=>{
                                      if(!value || !Array.isArray(value) || !value.length){
                                          callback(new Error("请选择查询时间范围!"))
                                      }else if(new Date(value[1]).getTime()-new Date(value[0]).getTime()>10 * 24 * 3600 * 1000){
                                          callback(new Error("时间范围不能大于10天!"))
                                      }else{
                                          callback()   // 自定义校验规则一定要注意这里的callback(),如果写少了会导致校验报错
                                      }
                            }  
                        }
                    ]
                }
             }
      },
      methods:{
        submitForm() {
           this.$refs.completedForm.validate((valid) => {
            console.log(this.completedForm.time[0])
                    if(valid){
                            if(this.completedForm.time){
                                  if(new Date(this.completedForm.time[1]).getTime()-new Date(this.completedForm.time[0]).getTime()>10*24*3600*1000){
                                        this.$message({
                                            type:'warning',
                                            message:'时间区间不能大于10天!',
                                            offset:100
                                        })
                                        return
                                  }
                            }
                            this.$message({
                                type:'warning',
                                message:'表单校验通过了!',
                                offset:100
                            })
                    }else{
                            this.$nextTick(() => {
                                            // 获取错误节点
                                            let isError = this.$refs.completedForm.$el.getElementsByClassName('is-error')
                                            isError[0].scrollIntoView({
                                                // 滚动到指定节点
                                                // 值有start,center,end,nearest,当前显示在视图区域中间
                                                block: 'center',
                                                // 值有auto、instant,smooth,缓动动画(当前是慢速的)
                                                behavior: 'smooth',
                                            })
                            })
                    }
           });
        },
        resetForm() {
             this.$refs.completedForm.resetFields();
        }
      }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码De搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值