Ant Design of Vue a-form表单效验用法(一)
   ( 这个表单基本上算是比较完整的,能完成表单回调、拿值、效验、v-fow等表单基本用法了 )
效果图:
1、

2、

因为我这个功能是企业开发中 所以暂时不能把源码发出,我先提出时间效验逻辑:
HTML:
        <a-row>
          <a-col :span="6" :offset="1">
            <a-form-item label="开始时间" :labelCol="{span: 9}" :wrapper-col="{ span: 12 }">
              <a-date-picker
                format="YYYY-MM-DD"
                style="width: 125px;"
                allowClear
                v-show="continuousTime"
                :disabled-date="handleData"
                v-decorator="['continuousStartTime', { rules: [{ required: startTimeRequired, message: '请选择开始日期!' }] }]"
                @openChange="continuousStartTimeOpenChange"
              />
            </a-form-item>
          </a-col>
          <a-col :span="11">
            <a-form-item>
              <a-time-picker
                :open.sync="continuousOpen"
                format="HH:mm"
                placeholder="开始"
                style="width: 80px;"
                @change="(val,dateStrings)=>changeTime(val,dateStrings,'startTime')"
                @openChange="continuousStartTimeOpenChange"
                v-decorator="['experssion.continuousDateTimeOnt', { rules: [{ required: continuousDateTimeOntRequired, message: '请选择开始时间!' }] }]"
              >
                <a-button slot="addon" size="small" type="primary" @click="handleCloseContinuous">确定</a-button>
              </a-time-picker>
            </a-form-item>
          </a-col>
        </a-row>
        <a-row>
          <a-col :span="6" :offset="1">
            <a-form-item label="结束时间" :labelCol="{span: 9}" :wrapper-col="{ span: 12 }">
              <a-date-picker
                format="YYYY-MM-DD"
                style="width: 125px;"
                allowClear
                v-show="continuousTime"
                :disabled-date="handleData"
                v-decorator="['continuousEndTime', { rules: [{ required: startTimeRequired, message: '请选择结束日期!' }] }]"
                @openChange="continuousStartTimeOpenChange"
              />
            </a-form-item>
          </a-col>
          <a-col :span="11">
            <a-form-item>
              <a-time-picker
                :open.sync="continuousOpen2"
                format="HH:mm"
                placeholder="结束"
                style="width: 80px;"
                :disabledHours="getDisabledHours"
                :disabledMinutes="getDisabledMinutes"
                @change="(val,dateStrings)=>changeTime(val,dateStrings,'endTime')"
                v-decorator="['experssion.continuousDateTimeTwo', { rules: [{ required: continuousDateTimeOntRequired, message: '请选择结束时间!' }] }]"
              >
                <a-button slot="addon" size="small" type="primary" @click="handleCloseContinuous">确定</a-button>
              </a-time-picker>
            </a-form-item>
          </a-col>
        </a-row>
JS:
    methods: {
        // 约束时间选择范围: 时
      getDisabledHours () {
         if (this.timeDisabled) {
            const hours = []
            const time = this.startTime
            const timeArr = time.split(':')
            for (let i = 0; i < parseInt(timeArr[0]); i++) {
               hours.push(i)
            }
            return hours
         } else {
            return []
         }
      },
      // 约束时间选择范围: 分
      getDisabledMinutes (selectedHour) {
         if (this.timeDisabled) {
            const time = this.startTime
            const timeArr = time.split(':')
            const minutes = []
            if (selectedHour === parseInt(timeArr[0])) {
               for (let i = 0; i < parseInt(timeArr[1]) + 1; i++) {
                  minutes.push(i)
               }
            }
            return minutes
         } else {
            return []
         }
      },
      // 选择日期或者时间关闭窗口后(效验日期是否规范、以及是否开启约束时间选择范围)
      continuousStartTimeOpenChange (status) {
         if (!status) {
            this.$nextTick(() => {
               this.form.validateFields([
                  'continuousStartTime',
                  'continuousEndTime',
                  'experssion.continuousDateTimeOnt',
                  'experssion.continuousDateTimeTwo'], (errors, values) => {
                  if (!errors && values) {
                     const formatStartTime = moment(moment(moment(values.continuousStartTime).valueOf()).format('YYYY-MM-DD')).valueOf()
                     const formatEndTime = moment(moment(moment(values.continuousEndTime).valueOf()).format('YYYY-MM-DD')).valueOf()
                     if (formatStartTime !== formatEndTime) {
                        this.timeDisabled = false
                        // 判断时间差
              // 这里判断时间差的话,如果时间的年月不一样的话,还是得通过时间戳判读时间大小
              //moment(values.experssion.continuousDateTimeOnt).valueOf() > moment(moment(values.experssion.continuousDateTimeOnt).format('YYYY-MM-DD') + ' ' +
                      moment(values.experssion.continuousDateTimeTwo).format('HH:mm:ss')).valueOf()
                     } else if (formatStartTime === formatEndTime && moment(values.experssion.continuousDateTimeTwo).diff(moment(values.experssion.continuousDateTimeOnt), 'minutes') < 0) {
                        this.timeDisabled = true
                        const arr = [{
                           message: '重新选择开始时间!',
                           field: 'experssion.continuousDateTimeOnt'
                        }]
                        const arr2 = [{
                           message: '重新选择结束时间!',
                           field: 'experssion.continuousDateTimeTwo'
                        }]
                        this.form.setFields({ 'experssion.continuousDateTimeOnt': { value: values.experssion.continuousDateTimeOnt, errors: arr } })
                        this.form.setFields({ 'experssion.continuousDateTimeTwo': { value: values.experssion.continuousDateTimeTwo, errors: arr2 } })
                     } else {
                        this.timeDisabled = true
                     }
                     if (formatStartTime > formatEndTime) {
                        const arr = [{
                           message: '日期不规范!',
                           field: 'continuousStartTime'
                        }]
                        const arr2 = [{
                           message: '日期不规范!',
                           field: 'continuousEndTime'
                        }]
                        this.form.setFields({ continuousStartTime: { value: values.continuousStartTime, errors: arr } })
                        this.form.setFields({ continuousEndTime: { value: values.continuousEndTime, errors: arr2 } })
                     }
                  }
               })
            })
         }
      },
      resetForm () {//mounted()中执行
         this.$nextTick(() => {
      // form表绑定的v-decorator回填
        this.form.setFieldsValue({  
          experssion:{ 
            continuousDateTimeOnt: moment('00:00', 'HH:mm'), 
            continuousDateTimeTwo: moment('23:59', 'HH:mm') 
          }, 
          continuousStartTime: moment(), continuousEndTime: moment() 
        }) 
      }) 
    }, 
}
要求效果图:
(时间约束)
1、开始结束为1天时:

2、开始结束不是一天时:

(日期规范)

先选择结束时间后在选开始时间:

多看官方文档api:
https://www.antdv.com/docs/vue/introduce-cn/
(日期效验就先弄到这,后期会提供间隔类型的日期效验以及数据回填、v-if导致的没有效验问题)
                    
                
                
            
        
浙公网安备 33010602011771号