Ant Design of Vue a-form表單效驗用法(一)


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導致的沒有效驗問題)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM