element日期插件datePick限制日期限制简单案例

本文介绍了一个使用Element UI的日期选择器组件实现特定日期限制的案例,确保用户只能选择当前日期到未来一年内及三个月范围内的日期,适用于系统设置中的用户管理模块。
1、需求描述

本案例采用的是两个日期框,具体需求如下,由于考虑到数据性能的问题,实际要求只能够查询三个月的数据,并且只能去搜索当前日期和之后一年内的数据(本案例只是单存的显示两个日期框的样式,不包含其他逻辑)
参考:https://www.cnblogs.com/belongs-to-qinghua/p/11752392.html

2、全部代码如下
<template>
  <div class="user">
    <!-- 面包屑 -->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item>系统设置</el-breadcrumb-item>
      <el-breadcrumb-item>用户管理</el-breadcrumb-item>
    </el-breadcrumb>
    <el-date-picker type="date"
                    placeholder="选择日期"
                    v-model="startTime"
                    value-format="yyyy-MM-dd"
                    :picker-options="startDateDisabled"
                    @change="getStartTime"
                    :editable="false"></el-date-picker>
    <el-date-picker type="date"
                    placeholder="选择日期"
                    v-model="endTime"
                    value-format="yyyy-MM-dd"
                    :picker-options="endDateDisabled"
                    @change="getEndTime"
                    :editable="false"></el-date-picker>
  </div>
</template>
<script>
export default {
  name: 'user',
  data() {
    return {
      startTime: "",
      endTime: "",
      startDateDisabled: this.getStartTime(),
      endDateDisabled: this.getEndTime()
    }
  },
  methods: {
    /**
       * 开始时间限制
       */
    getStartTime() {
      const self = this;
      return {
        disabledDate: (time) => {
          if (self.endTime) {//结束时间不为空时
            let endDate = new Date(self.endTime).getTime();
            let three = 90 * 24 * 3600 * 1000;
            let threeMonths = endDate - three;
            if (new Date().getTime() - threeMonths > 0) {
              return time.getTime() < Date.now() - 8.64e7 || time.getTime() > endDate;
            } else {
              return time.getTime() < threeMonths - 8.64e7 || time.getTime() > endDate;
            }
          } else {//结束时间为空
            let curDate = (new Date()).toString() // 当前时间戳转为字符串
            let curDateYear = (new Date()).getFullYear() // 当前时间的年份
            let oneYearAgoDate = curDate.replace(curDateYear, curDateYear + 1)// 字符串年份替换为一年后
            let three = 90 * 24 * 3600 * 1000;
            let oneYear = new Date(oneYearAgoDate).getTime() - three //一年后字符串转为时间戳并且减去三个月
            return time.getTime() < Date.now() - 8.64e7 || time.getTime() > oneYear;
          }
        }
      }
    },
    /**
     * 结束时间限制
     */
    getEndTime() {
      const self = this;
      return {
        disabledDate: (time) => {
          if (self.startTime) {//开始日期不为空
            let startDate = new Date(self.startTime).getTime();
            let three = 90 * 24 * 3600 * 1000;
            let threeMonths = startDate + three;
            return time.getTime() < startDate - 8.64e7 || time.getTime() > threeMonths;
          } else {//开始时间为空
            let curDate = (new Date()).getTime();
            let three = 90 * 24 * 3600 * 1000;
            let threeMonths = curDate + three;

            let curStr = (new Date()).toString() // 当前时间戳转为字符串
            let curDateYear = (new Date()).getFullYear() // 当前时间的年份
            let oneYearAgoDate = curStr.replace(curDateYear, curDateYear + 1)// 字符串年份替换为一年后
            let oneYear = new Date(oneYearAgoDate).getTime();//转换成毫秒数
            return time.getTime() < threeMonths - 8.64e7 || time.getTime() > oneYear;
          }
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
</style>

3、代码说明
  1. 需要添加:editable=“false”,禁用手动编辑,目的是出现超过范围日期可以被输入的情况
<el-date-picker type="date"
                    placeholder="选择日期"
                    v-model="startTime"
                    value-format="yyyy-MM-dd"
                    :picker-options="startDateDisabled"
                    @change="getStartTime"
                    :editable="false"></el-date-picker>
  1. 开始时间限制思路,开始时间限制有三种情况:
  • [1] 结束日期为空时,开始日期的限制范围为当前日期到当前日期一年后日期减去三个月的日期范围
	let curDate = (new Date()).toString() // 当前时间戳转为字符串
    let curDateYear = (new Date()).getFullYear() // 当前时间的年份
    let oneYearAgoDate = curDate.replace(curDateYear, curDateYear + 1)// 字符串年份替换为一年后
    let three = 90 * 24 * 3600 * 1000;
    let oneYear = new Date(oneYearAgoDate).getTime() - three //一年后字符串转为时间戳并且减去三个月
    return time.getTime() < Date.now() - 8.64e7 || time.getTime() > oneYear;
  • [2] 结束日期不为空并且,当前日期之前-结束日期减三个月的日期大于0,那么这个时候开始日期的限制范围就是:当前日期到结束日期
	let endDate = new Date(self.endTime).getTime();
    let three = 90 * 24 * 3600 * 1000;
    let threeMonths = endDate - three;
    if (new Date().getTime() - threeMonths > 0) {//当前日期到结束日期
       return time.getTime() < Date.now() - 8.64e7 || time.getTime() > endDate;
    } else {
       return time.getTime() < threeMonths - 8.64e7 || time.getTime() > endDate;
    }
  • [3] 结束日期不为空并且,当前日期之前-结束日期减三个月的日期小于等于0,那么这个时候开始日期的限制范围就是:结束日期减三个月的日期到结束日期
	let endDate = new Date(self.endTime).getTime();
    let three = 90 * 24 * 3600 * 1000;
    let threeMonths = endDate - three;
    if (new Date().getTime() - threeMonths > 0) {
        return time.getTime() < Date.now() - 8.64e7 || time.getTime() > endDate;
    } else {//结束日期减三个月的日期到结束日期
       return time.getTime() < threeMonths - 8.64e7 || time.getTime() > endDate;
    }
  1. 结束日期限制思路,结束日期分为两种情况
  • [1] 开始日期为空时,结束日期限制范围:当前日期+三个月日期到当前日期一年后日期
	let curDate = (new Date()).getTime();
    let three = 90 * 24 * 3600 * 1000;
    let threeMonths = curDate + three;

    let curStr = (new Date()).toString() // 当前时间戳转为字符串
    let curDateYear = (new Date()).getFullYear() // 当前时间的年份
    let oneYearAgoDate = curStr.replace(curDateYear, curDateYear + 1)// 字符串年份替换为一年后
    let oneYear = new Date(oneYearAgoDate).getTime();//转换成毫秒数
    return time.getTime() < threeMonths - 8.64e7 || time.getTime() > oneYear;
  • [2] 开始日期不为空时,结束日期限制范围:开始日期到开始日期+三个月日期
	let startDate = new Date(self.startTime).getTime();
    let three = 90 * 24 * 3600 * 1000;
    let threeMonths = startDate + three;
    return time.getTime() < startDate - 8.64e7 || time.getTime() > threeMonths;
4、结语

至此该案例完成,希望对于其他同学能提供些思路。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值