elementui 日期选择器动态限制选择范围

碰到个需求是在日期范围中,需要根据用户选择一个日期后动态的进行限制只能选择前后一个礼拜

一、 根据文档利用el-date-picker组件自带的pickerOptions属性可以完成这个需求,代码如下:

// template
<el-date-picker
    @blur="blurDate"
    v-model="form.dateArr"
    type="daterange"
    range-separator="-"
    value-format="yyyy-MM-dd"
    :pickerOptions="timeOption"
    start-placeholder="开始日期"
    end-placeholder="结束日期">
 </el-date-picker>


// data中
data() {
  return {
    timeOption: {
     onPick: ({ maxDate, minDate }) => {
         this.minDate = minDate
         this.maxDate = maxDate
      },
      disabledDate: (time) => {
        if (this.minDate && !this.maxDate) {
            const range = 6 * 24 * 3600 * 1000  // 要更改禁用的日期范围只要修改这里的代码就可以
             const minTime = this.minDate.getTime()
             const newTime = time.getTime()
             return newTime > (minTime + range) || newTime < (minTime - range) 
          }
          return false
      }
     },
     minDate: '',
     maxDate: ''
   }
}

效果图:
在这里插入图片描述

但是发现还是有点问题的,当用户点击一个日期后,关闭日期选择框再打开,会发现之前禁用的日期还被禁用着,这是个小问题,解决方案:

添加一个失焦事件,当失焦时清除选中的日期: 在el-date-picker标签中添加 @blur=“blurDate”,然后在methods中定义方法:

	<el-date-picker
       	@blur="blurDate" // 上面代码已添加失焦事件
    </el-date-picker>


    methods:{
        blurDate() {
            this.minDate = ''
        },
	}

二、补充 (日期控件其他控制禁用日期方法)

  1. 只能选择当前月份之前或者之后的月份
// template  el-date-picker类型为monthrange,选择月份
    <el-date-picker
        v-model="formData.month"
        :pickerOptions="timeOption"
        type="monthrange"
        range-separator="-"
        start-placeholder="开始月份"
        end-placeholder="结束月份" value-format="yyyy-MM">
    </el-date-picker>
    
    
// data中
data() {
    return {
       timeOption: {
          disabledDate: (time) => {
              var date = new Date();
              var year = date.getFullYear();
              var month = date.getMonth() + 1;
              if (month >= 1 && month <= 9) {
                  month = "0" + month;
              }
              var currentdate = year.toString()  + month.toString();
              var timeyear = time.getFullYear();
              var timemonth = time.getMonth() + 1;
              if (timemonth >= 1 && timemonth <= 9) {
                  timemonth = "0" + timemonth;
              }
              var timedate = timeyear.toString() + timemonth.toString();
              return currentdate > timedate;  // 修改这里的大于或小于控制禁用之前月份还是之后月份
          }
        },
    }
}

  1. 只能选择当天日期之前的或者之后的日期
// template
<el-date-picker
     v-model="form.date"
     type="daterange"
     range-separator="-"
     value-format="yyyy-MM-dd"
     :pickerOptions="timeOption"
     start-placeholder="开始日期"
     end-placeholder="结束日期">
 </el-date-picker>
 
 
// data中
data() {
  return {
     timeOption: {
        disabledDate:(time)=>{
             return time.getTime() < new Date()  // 修改这里的大于或小于控制禁用之前日期还是之后日期
          }
        },
    }
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杨小凹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值