element 动态改变el-date-picker的可选时间范围

element 动态改变el-date-picker的可选时间范围

在开发web端项目时,我们经常会遇到通过各种时间范围筛选条件查数据,那我们element的时间选择器是最常用的,有时候由于需求,我们需要给时间控件加上可以选择区间,固定的可选区间还好,如果是动态的呢?先给大家看看我的应用场景。
应用场景
上图就是我的应用场景了,根据左边的年份选择的是哪一年,右边的选择月度区间只能选择那一年以内的月份,前一年的也选不了,左边的年份选择之后右边的月度可选区间动态改变,话不多说上代码。

//结构代码块
<el-form-item label="年份">
  <el-date-picker
     v-model="value3"
     type="year"
     size="medium"
     placeholder="选择年"
   ></el-date-picker>
 </el-form-item>
<el-form-item label="选择月度" >
    <el-date-picker
       v-model="value4"
       type="monthrange"
       clearable
       range-separator="至"
       start-placeholder="开始月份"
       end-placeholder="结束月份"
       :picker-options="pickerOptions"  //这个属性是关键
       >
     </el-date-picker>
 </el-form-item>

下面逻辑代码

data(){
   let disabledDate = (time) => {//这个关键属性我们一定要写在data的里面并且return的外面,这是动态改变区间的关键
      let year = moment(this.value3).format('YYYY')//根据左边年份的时间获取年
      var firstMonth= new Date(+year,1,1);//element的时间控件区间控制是基于js的时间对象来控制的,我们需要转时间对象
      firstMonth.setMonth(0);//设置为这一年的第一个月,这里的0是下标
      var lastMonth= new Date(+year,1,1);//转时间对象
       lastMonth.setMonth(11);//设置为这一年的最后一个月,这里的11是下标
      return time.getTime() > new Date(lastMonth)  || time.getTime() < new Date(firstMonth) 
      //这一年的第12月份的以后的月份不能选,这一年1月份之前的月份也不能选
    }
    return {
      value3: moment(new Date()).format("YYYY"),
      pickerOptions: {
        disabledDate,//上面处理好逻辑扔到这来,和表单自定义校验规则一个套路
      },
  },

以上就是所有逻辑和代码了,通过这番操作,我感觉js原生的时间对象的一些东西我得去好好看看了,哈哈,尴尬

### 如何限制 Element Plus 中 el-date-picker 的最大时间范围为 3 个月 为了实现 `el-date-picker` 组件的最大时间范围限制为 3 个月,可以通过自定义逻辑来控制可选日期的范围。具体来说,可以利用组件的 `disabled-date` 属性以及 JavaScript 来计算并禁用超出指定范围的日期。 以下是完整的解决方案: #### HTML 部分 ```html <el-date-picker v-model="selectedDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" :disabled-date="disableDatesOutsideThreeMonths" /> ``` #### JavaScript 部分 ```javascript <script> export default { data() { return { selectedDate: null, // 存储用户选择的日期范围 }; }, methods: { disableDatesOutsideThreeMonths(time) { const today = new Date(); const maxAllowedRangeInMs = 3 * 30 * 24 * 60 * 60 * 1000; // 假设每个月按 30 天计算 const minAllowedStartDate = new Date(today); const maxAllowedEndDate = new Date(today.getTime() + maxAllowedRangeInMs); // 计算当前日期到未来三个月的时间戳范围 const isBeforeMinStart = time.getTime() < minAllowedStartDate.getTime(); const isAfterMaxEnd = time.getTime() > maxAllowedEndDate.getTime(); return isBeforeMinStart || isAfterMaxEnd; }, }, }; </script> ``` 上述代码通过 `disableDatesOutsideThreeMonths` 方法实现了对日期的选择限制。该方法会动态计算允许选择的日期范围,并返回布尔值以决定某个特定日期是否被禁用。 --- #### 关键点解析 1. **`disabled-date` 属性的作用** - 此属性用于接收一个函数,该函数接受单个参数(即待验证的日期对象),并通过返回布尔值来判断此日期是否可用[^3]。 2. **时间范围的计算** - 使用 `new Date()` 获取今天的日期作为起点。 - 利用毫秒数计算未来的三个时间段:假设每月有 30 天,则总时间为 \(3 \times 30 \times 24 \times 60 \times 60\) 秒转换成毫秒单位。 3. **禁用条件** - 如果某天早于今天或者晚于未来三月后的第一天,则将其标记为不可选--- #### 默认日期设置 如果希望在页面加载时自动填充默认日期范围,可以在初始化数据时完成这一操作。例如: ```javascript data() { return { selectedDate: [ new Date(), // 当前日期作为起始日 new Date(new Date().setMonth(new Date().getMonth() + 3)), // 未来第三个月的第一天作为终止日 ], }; }, ``` 这一步骤确保了用户体验的一致性和便利性[^4]。 --- ### 注意事项 - 上述代码中的月份长度按照固定 30 天处理,实际应用中可能需要考虑不同月份的实际天数差异。 - 若需支持国际化或更复杂的业务场景,建议引入专门的日历库辅助运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

段子君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值