el-datepicker禁用未来日期(包含时分秒)type=‘datetime’

文章目录

    • 实现代码

      • 方式1:当选中日期的时候去更新一次。
      • [方式2: 优化版本,使用 setTimout 每分钟更新一次。(防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变)](#方式2: 优化版本,使用 setTimout 每分钟更新一次。(防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变))
    • 2024年10月30日更新:

      • [禁用日期后 此刻按钮功能失效解决办法:](#禁用日期后 此刻按钮功能失效解决办法:)

      el-datepicker 选择器禁用未来日期,动态禁用 时分秒;
      秒 这一列的选项没有禁用的样式 可以随便选,
      但是 点击确定后时间会更新到限制的那个时间(选中日期的那一刻)。

实现代码

方式1:当选中日期的时候去更新一次。

html 复制代码
<template>
  <div class="hello">
    <el-date-picker
      v-model="time"
      type="datetime"
      :picker-options="{
        disabledDate(time) {
          const nowTime = new Date()
          return new Date(time).getTime() > nowTime.getTime()
        },
        selectableRange
      }"
    ></el-date-picker>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',

  data() {
    return {
      time: ''
    }
  },

  computed: {
  	// 限制时分秒选择范围
  	/*
  	* 当切换年月日的时候要动态去改变
  	* onPick 方法只能在 时间范围 选择器才能用;
  	* 但当修改选中日期的时候可以使用 watch / computed 监听到变动。
  	*/
    selectableRange() {
      const nowTime = new Date()
      const isSame = new Date(this.time).toLocaleDateString() === nowTime.toLocaleDateString()
      if (isSame) {
        return `00:00:00-${nowTime.getHours()}:${nowTime.getMinutes()}:${nowTime.getSeconds()}`
      }
      return '00:00:00-23:59:59'
    }
  }
}
</script>

方式2: 优化版本,使用 setTimout 每分钟更新一次。(防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变)

html 复制代码
<template>
  <div class="hello">
    <el-date-picker
      v-model="time"
      type="datetime"
      :picker-options="{
        disabledDate(time) {
          const nowTime = new Date()
          return new Date(time).getTime() > nowTime.getTime()
        },
        selectableRange
      }"
      @change="changeDate"
    ></el-date-picker>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',

  data() {
    return {
      time: '',
      selectableRange: '00:00:00-23:59:59',
      timer: null
    }
  },

  watch: {
    time(newTime, oldTime) {
      // 在滚动选择时分秒的时候也会被 watch 监听到
      // 在这里判断 如果年月日相同,就不再去更新。
      const sameDay = new Date(newTime).toLocaleDateString() === new Date(oldTime).toLocaleDateString()
      if (sameDay) return
      this.updateSelectableRange()
    }
  },

  methods: {
    updateSelectableRange() {
      const nowTime = new Date()
      const isSame = new Date(this.time).toLocaleDateString() === nowTime.toLocaleDateString()
      this.clearTimer()

      if (isSame) {
        this.selectableRange = `00:00:00-${nowTime.getHours()}:${nowTime.getMinutes()}:${nowTime.getSeconds()}`

        // 创建一个定时器,每分钟更新去更新一次禁用范围。
        const delay = 60 - nowTime.getSeconds()
        this.timer = setTimeout(() => {
          this.updateSelectableRange()
        }, delay * 1000)
        return
      }
      this.selectableRange = '00:00:00-23:59:59'
    },

    clearTimer() {
      if (this.timer) {
        clearTimeout(this.timer)
        this.timer = null
      }
    },

    changeDate() {
      // 选中日期之后清除掉定时器
      this.clearTimer()
    }
  }
}
</script>

2024年10月30日更新:

禁用日期后 此刻按钮功能失效解决办法:

el-datepicker此刻按钮点击失效

相关推荐
GreenTea8 小时前
🔥别再用压缩了,Codex、NVIDIA、DeepSeek、Uber 给出 Agent 上下文管理的新答案
前端·后端·算法
IT_陈寒8 小时前
React重渲染这坑,我跳进去又爬出来了
前端·人工智能·后端
郑州光合科技余经理10 小时前
本地生活系统:多业务订单字段怎么分账本导出
java·开发语言·前端·数据库·uni-app·php·ai编程
怕浪猫16 小时前
FDE 如何正确解决现场项目工程性的问题
前端·后端·ai编程
西瓜太郎123417 小时前
外层模型卡片与分组详情成功率不一致,应该怎么排查?
前端·typescript·go·软件工程·react
GreenTea17 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
几何心凉20 小时前
没有万能模型:我用 AiiOnly Token Plan,把多款大模型的长处拼进同一个项目
前端
kyriewen20 小时前
Claude Code 的额度今天缩水了17%——官方公告上写的是"永久提高25%"
前端·ai编程·claude
雪芽蓝域zzs21 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js
风骏时光牛马1 天前
从零到实战,完整AI学习路线
前端