【问题记录】解决Ant Design Vue组件库 a-range-picker组件中日期禁用的自定义实现

1,637 阅读1分钟

本文实现基于Ant Design Vue@1.7.8版本,其他版本可参考思路

设计需求

选择范围日期,满足条件如下

  1. 只能选择今天之前的时间
  2. 时间范围最大选择31天

代码实现

废话不多说,直接上代码,demo代码实现如下:

<template>
  <div id="app">
    <a-range-picker
      v-model="value"
      :valueFormat="NORMAL_DATE"
      :disabledDate="disabledFn"
      @calendarChange="calendarChange"
    />
  </div>
</template>
<script>
import dayjs from "dayjs";
const NORMAL_DATE = "YYYY-MM-DD";
export default {
  name: "App",
  data() {
    return {
      NORMAL_DATE,
      disabledFn: this.disabledDate, // 动态更新disabled函数
      value: []
    };
  },
  methods: {
    disabledDate(current) {
      // 只能选择今天之前的时间
      return !(current && current < dayjs().startOf("day"));
    },
    calendarChange([begin]) {
      // 第一次选择的开始时间
      begin = dayjs(begin, NORMAL_DATE);
      // 开始时间前的第31天
      const before31 = begin.add(-31, "day").endOf('day');
      // 开始时间后的第31天
      const end31 = begin.add(31, "day").startOf('day');

      this.disabledFn = current => {
        // 不在以下范围内的日期全部禁用
        return !(
          current &&
          // 选择日期在今天之前
          current < dayjs().startOf("day") &&
          // 选择日期在开始时间前的第31天之后
          current.valueOf() >= before31.valueOf() &&
          // 选择日期在开始时间后的第31天之前
          current.valueOf() <= end31.valueOf()
        );
      };
    }
  }
};
</script>

实现思路

由于 a-range-picker 组件提供的api有限,这里通过 calendarChange 事件来修改组件的禁用行为,实现的思路如下:

  • 当选择开始时间,默认 disabledDate 的行为是,只能选择今天之前的时间
  • 当选择结束时间,修改 disabledDate 的行为是,控制选择的时间范围在开始时间的31天之内,并且满足只能选择今天之前的时间

测试功能

  • ✅已达标,选择开始时间,只能选择今天(3月1日)之前的日期

image.png

  • ✅已达标,选择开始时间为1月20日,结束时间可选开始时间之前31天,边界为12月21日

image.png

  • ✅已达标,选择开始时间为1月20日,结束时间可选开始时间之后31天,边界为2月19日

image.png

  • ✅已达标,选择开始时间为2月10日,结束时间可选开始时间之前31天,边界为1月11日;可选开始时间之后31天,并且满足只能选择今天(3月1日)之前的日期,边界为2月28日

image.png

总结

通过组件提供的 calendarChange 动态修改组件的 disabledDate 函数属性,使得选择开始时间和结束时间的禁用的行为不一样,从而实现最终的需求。