Element Plus、Element日期范围选择器实现选择限制、禁止跨月选择。

Element Plus日期范围选择限制

前言

在使用 Element Plus 框架时,遇到了需要限制用户不能跨月选择日期范围的需求。客户要求在查询收益的报表中,只希望用户选择同一个月内的日期范围。

问题分析

Element Plus 的日期范围选择器需要用户选择两次(开始日期和结束日期),而 disabled-date 函数只能获取到当前被检查的日期,无法知道用户已经选择了哪个开始日期。因此,我们需要一种方法来捕获用户的选择过程。

解决方案

核心思路

使用 @calendar-change 事件来捕获用户的选择过程,@calendar-change返回值为日期对象组成的数组,当第二个值为null时就表明用户选择了开始日期,此时就可以配合 disabled-date 属性来实现跨月限制。

实现步骤

1. 日期选择器
<el-date-picker
  v-model="queryParams.date"
  type="daterange"
  range-separator="-"
  start-placeholder="开始日期"
  end-placeholder="结束日期"
  :clearable="true"
  :disabled-date="disabledDate"
  @calendar-change="handleCalendarChange"
/>

关键是 :disabled-date="disabledDate"禁用日期和@calendar-change="handleCalendarChange"用户选择事件

2. 储存用户选择
// 存储用户选择的开始日期(用于跨月限制)
const pickedStartDate = ref<Date | null>(null);
3. 处理日历变化事件
// 处理日历变化事件
const handleCalendarChange = (value: any) => {
  console.log('calendar-change', value);

  if (value && Array.isArray(value)) {
    const [startDate, endDate] = value;
    
    if (startDate && !endDate) {
      // 用户选择了开始日期,但还没选择结束日期,将选择的日期储存,用于禁用日期的判断
      pickedStartDate.value = new Date(startDate);
      console.log('开始日期选择:', pickedStartDate.value);
    } else {
      // 清空选择
      pickedStartDate.value = null;
      console.log('清空选择');
    }
  }
};
4. 实现禁用日期函数
// Element Plus 的禁用日期函数
const disabledDate = (time: Date) => {
  // 如果没有选择开始日期,不禁用任何日期
  if (!pickedStartDate.value) {
    return false;
  }

  const startYear = pickedStartDate.value.getFullYear();
  const startMonth = pickedStartDate.value.getMonth();
  const currentYear = time.getFullYear();
  const currentMonth = time.getMonth();

  // 禁用与开始日期不在同一月的日期
  return currentYear !== startYear || currentMonth !== startMonth;
};

关键知识点

calendar-change 事件详解

calendar-change 事件会在用户选择日期时触发,返回一个日期对象数组:

  • ["2025-09-03T16:00:00.000Z", null] - 用户选择了开始日期,但还没选择结束日期
  • ["2025-09-03T16:00:00.000Z", "2025-09-10T16:00:00.000Z"] - 用户完成了日期范围选择

工作流程

  1. 初始状态pickedStartDate 为 null,所有日期可选
  2. 选择开始日期calendar-change 触发,pickedStartDate 设置为开始日期,disabledDate 检查每个日期,禁用与开始日期不在同一月的日期
  3. 页面效果:用户点击的月份以外都是禁用的 ↓↓↓
    在这里插入图片描述

Element版本

1. 使用picker-options
<el-date-picker 
	v-model="query.dateRange"
	type="daterange"
	range-separator="-"
	start-placeholder="开始日期"
    end-placeholder="结束日期"
    value-format="yyyy-MM-dd"
    :picker-options="pickerOptions"
/>
2.定义data
// 在 data 中添加
pickedStartDate: null,
pickerOptions: {
  onPick: ({ maxDate, minDate }) => {
    if (minDate && !maxDate) {
      this.pickedStartDate = minDate;
    } else if (maxDate && minDate) {
      this.pickedStartDate = null;
    }
  },
  disabledDate: (time) => {
    if (!this.pickedStartDate) {
      return false;
    }
    
    const startYear = this.pickedStartDate.getFullYear();
    const startMonth = this.pickedStartDate.getMonth();
    const currentYear = time.getFullYear();
    const currentMonth = time.getMonth();
    
    return currentYear !== startYear || currentMonth !== startMonth;
  }
}

总结

element plus通过使用 @calendar-change 事件捕获用户选择过程,配合 disabled-date 属性实现跨月限制。element则使用picker-options属性,内部的onPick逻辑和calendar-change本质是一样的,disabledDate更是原封不动。

Element Plus 日期选择器限制选择时间范围可通过以下几种方式实现: ### 限制指定日期和时间不可选择 使用 `disabled-date`、`disabled-hours`、`disabled-minutes` 和 `disabled-seconds` 来分别限制日期、小时、分钟和秒的选择。例如,在指定日期时间前不可选择: ```vue <template> <el-date-picker v-model="date" type="datetime" :disabled-date="disabledDate" :disabled-hours="disabledHours" :disabled-minutes="disabledMinutes" :disabled-seconds="disabledSeconds" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择日期时间" > </el-date-picker> </template> <script setup> import { ref } from 'vue'; const date = ref(null); const disabledDate = (time) => { // 例如,限制在当前日期之前的日期不可选 return time.getTime() < Date.now() - 8.64e7; }; const disabledHours = () => { // 限制某些小时不可选,这里假设 0 - 5 点不可选 return [0, 1, 2, 3, 4, 5]; }; const disabledMinutes = () => { // 限制某些分钟不可选,这里假设 0 - 10 分不可选 return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; }; const disabledSeconds = () => { // 限制某些秒不可选,这里假设 0 - 20 秒不可选 return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; }; </script> ``` 此方式可精准控制每个时间维度的可选范围[^1]。 ### 限制日期范围 可以限制年份、份、天数等范围。例如,限制年份范围在 5 年(最多选 5 年),当选择日期时触发 `cakebdarChange`,然后通过 `disabledDate` 禁用日期;限制份范围在 24 个限制天数范围在 60 天: ```vue <template> <el-date-picker v-model="date" type="date" @change="calendarChange" :disabled-date="disabledDate" value-format="yyyy-MM-dd" placeholder="请选择日期" > </el-date-picker> </template> <script setup> import { ref } from 'vue'; const date = ref(null); const selectedDate = ref(null); const calendarChange = (val) => { selectedDate.value = val; }; const disabledDate = (time) => { if (selectedDate.value) { const fiveYearsAgo = new Date(selectedDate.value); fiveYearsAgo.setFullYear(fiveYearsAgo.getFullYear() - 5); const fiveYearsLater = new Date(selectedDate.value); fiveYearsLater.setFullYear(fiveYearsLater.getFullYear() + 5); return time.getTime() < fiveYearsAgo.getTime() || time.getTime() > fiveYearsLater.getTime(); } return false; }; </script> ``` 此方式可对日期范围进行宏观控制[^2]。 ### 正则校验时间范围 利用 element-plus 中的 form 表单验证完成时间范围的正则校验。例如: ```vue <template> <el-form :model="form" ref="formRef"> <el-form-item label="检查计划截止日期:" prop="deadline"> <el-date-picker v-model="form.deadline" value-format="YYYY-MM-DD" style="width: 100%" type="date" placeholder="请选择" size="small" > </el-date-picker> </el-form-item> <el-form-item> <el-button @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script setup> import { ref } from 'vue'; import { useForm } from 'element-plus'; const form = ref({ deadline: null, }); const formRef = ref(null); const { validate } = useForm(formRef); const submitForm = () => { validate((valid) => { if (valid) { console.log('表单验证通过'); } else { console.log('表单验证失败'); } }); }; </script> ``` 此方式可在提交表单时对时间范围进行校验[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值