element-ui的日期控件DatePicker,开始日期结束日期限制日期选择

有两个需求,一个是录入页面,开始时间和结束时间是两个表单元素,分开着的,要做限制;另一个是时间搜索选项,要选择时间范围,这个是要用同一个日期选择框,要做限制;

两个日期选框需求:

  1. 结束日期不能大于开始日期,
  2. 选择时间在当日(包含当日)后的14天内;

一个日期选框需求:

  1. 选择时间当日前,整体范围在三年内,
  2. 选择时间范围不能超过一个月;

日期限制思路

一个选框,结束日期不能大于日期,可以在选择@change后判断两个日期大小,如果不符合条件,触发表单验证提示。或者在一个选择后,另一个设置disabledDate。选择时间在当日(包含当日)后的14天内也在disabledDate中设置;
两个选框,主要计算一个月范围,不是30天,而且要判断选择的第一个日期的前一个月和后一个月范围去做disabledDate;三年主要是计算三年的时间。


下面直接来案例

1.两个日期选框

<el-form :rules="dataRule" v-bind:model="dataForm" ref="dataForm">
 <el-form-item prop="disStartDate">
  <el-date-picker
    v-model="dataForm.disStartDate"
    type="date"
    value-format="yyyy-MM-dd"
    placeholder="请输入优惠开始日期"
    :picker-options="pickerOptionsS"
    @blur="startDateBlur"
  ></el-date-picker>
</el-form-item>
<el-form-item prop="disEndDate">
  <el-date-picker
    v-model="dataForm.disEndDate"
    type="date"
    value-format="yyyy-MM-dd"
    placeholder="请输入优惠结束日期"
    :picker-options="pickerOptionsE"
    @blur="endDateBlur"
  ></el-date-picker>
 </el-form-item>
</el-form>

<script>
export default {
  name: "addEdit",
  data() {
    return {
     dataForm: {
     	disStartDate: '',
     	disEndDate: ''
     },
     pickerOptionsS: {
	  disabledDate:(time)=> {
	    // 设置可选择的日期为今天之后的一个月内
	    let curDate = (new Date()).getTime();
	    // 这里算出一个月的毫秒数,这里使用30的平均值,实际中应根据具体的每个月有多少天计算
	    let day = 14 * 24 * 3600 * 1000;
	    let dateRegion = curDate + day;
	    let end = "";
	    if(!this.disStartDate && this.disEndDate){
	    	end = new Date(this.disEndDate).getTime();
	    	return time.getTime() < curDate || time.getTime() >= dateRegion || time.getTime() > end;
	    }else{
	    	return time.getTime() < curDate  //限制小于当天的日期
	    	|| time.getTime() >= dateRegion ; //限制大于14天后的日期
	    }
	  }
	},
	pickerOptionsE: {
	  disabledDate:(time)=> {
	    let curDate = (new Date()).getTime();
	    let day = 14 * 24 * 3600 * 1000;
	    let dateRegion = curDate + day;
	    let start = "";
	    if(this.disStartDate && !this.disEndDate){
	    	start = new Date(this.disStartDate).getTime();
	    	return time.getTime() < curDate || time.getTime() >= dateRegion || time.getTime() < start;
	    }else{
	    	return time.getTime() < curDate  //限制小于当天的日期
	    	|| time.getTime() >= dateRegion ; //限制大于14天后的日期
	    }
	  }
	},
     dataRule: {
      disStartDate: [
          { 
            required: true,
            validator: (rule, value, callback) => {
              let start = value ? new Date(value).getTime() : 0;
              let end = this.dataForm.disEndDate ? new Date(this.dataForm.disEndDate).getTime() : 0;
              if(!start){
                return callback(new Error('优惠开始日期不能为空'))
              }if(start && end && start > end){
                this.dataForm.disStartDate = "";
                return callback(new Error('优惠结束日期需大于开始日期'))
              }else{
                callback();
              }
            },
            trigger: "blur"
          }
        ],
        disEndDate: [
          { 
            required: true, 
            validator: (rule, value, callback) => {
              let start = this.dataForm.disStartDate ? new Date(this.dataForm.disStartDate).getTime() : 0;
              let end = value ? new Date(value).getTime() : 0;
              if(!start){
                return callback(new Error('优惠结束日期不能为空'))
              }else if(start && end && start > end){
                this.dataForm.disEndDate = "";
                return callback(new Error('优惠结束日期需大于开始日期'))
              }else{
                callback();
              }
            },trigger: "blur"
          }
        ]
     }
    }
  },
  methods: {
   startDateBlur(){
  	this.$refs.dataForm.validateField('disEndDate');
   },
   endDateBlur(){
  	this.$refs.dataForm.validateField('disStartDate');
   },
  }
}
</script>

2.一个日期选框

<el-form-item class="date-range" label="制单日期范围">
    <el-date-picker
      v-model="timeRange"
      :clearable="false"
      type="daterange"
      format="yyyy-MM-dd"
      value-format="yyyy-MM-dd"
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      @change="transferDateChange"
      :picker-options="pickerOptions"
    ></el-date-picker>
 </el-form-item>

export default {
  name: "addEdit",
  data() {
    let _minDate = "";
    let _maxDate = "";
    return {
     dataForm: {
     	timeRange: [],
     	queryData: {},
     	pickerOptions: {
     	 onPick(time){
        _minDate = time.minDate ? time.minDate : '';
        _maxDate = time.maxDate ? time.maxDate : '';
      },
      disabledDate(time) {
        let today = that.$util.formatDate(new Date());
        let threeYearAgo = new Date().getFullYear() - 3 + today.slice(4);//近3年
        if (_minDate && !_maxDate) {
          let threeMonthAgo = "";
          let threeMonthLater = "";
          let selectMinDate = that.$util.formatDate(new Date(_minDate));
          let selectMinDateMon = Number(new Date(_minDate).getMonth());
          //获取三个月前的日期
          if(new Date(_minDate).getMonth()>2){
            threeMonthAgo = selectMinDate.slice(0,5) +  that.$validate.formatMonDay(selectMinDateMon - 2) + selectMinDate.slice(7);
          }else{
            threeMonthAgo = (selectMinDate.slice(0,4) -1) + "-" + that.$validate.formatMonDay(selectMinDateMon - 2 + 12) + selectMinDate.slice(7);
          }
          //获取三个月后的日期
          if(new Date(_minDate).getMonth()>8){
            threeMonthLater = (Number(selectMinDate.slice(0,5))+1) +  that.$validate.formatMonDay(selectMinDateMon -12 + 4) + selectMinDate.slice(7);
          }else{
            threeMonthLater = selectMinDate.slice(0,5) +  that.$validate.formatMonDay(selectMinDateMon + 4) + selectMinDate.slice(7);
          }
          return time.getTime() > new Date(threeMonthLater).getTime() || time.getTime() < new Date(threeMonthAgo).getTime() 
          || time.getTime() > new Date().getTime() || time.getTime() < new Date(threeYearAgo).getTime();
        }else{
          return time.getTime() > new Date().getTime() || time.getTime() < new Date(threeYearAgo).getTime();
     	}
      },
    }
  },
  methods:{
   transferDateChange(){
	this.queryData.startDate = this.timeRange ? this.timeRange[0] : '';
	this.queryData.endDate = this.timeRange ? this.timeRange[1] : '';
   }
  }
}

猜你喜欢

转载自blog.csdn.net/qq_34664239/article/details/107581283
今日推荐