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此刻按钮点击失效

相关推荐
Spider_Man18 分钟前
打造属于你的前端沙盒 🎉
前端·typescript·github
用户479492835691520 分钟前
🤫 你不知道的 JavaScript:`"👦🏻".length` 竟然不是 1?
前端·javascript·面试
掘金一周21 分钟前
凌晨零点,一个TODO,差点把我们整个部门抬走 | 掘金一周 9.11
前端·人工智能·后端
用户81744134274824 分钟前
kubernetes核心概念 Service
前端
东北南西33 分钟前
Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
前端·javascript
Zz_waiting.34 分钟前
案例开发 - 日程管理 - 第六期
前端·javascript·vue.js·路由·router
袁煦丞41 分钟前
企业微信开发者的‘跨网穿梭门’:cpolar内网穿透实验室第499个成功挑战
前端·程序员·远程工作
Simon_He1 小时前
vue-markdown-renderer:比 vercel streamdown 更低 CPU、更多节点支持、真正的流式渲染体验
前端·vue.js·markdown
机构师1 小时前
<uniapp><指针组件>基于uniapp,编写一个自定义箭头指针组件
javascript·uni-app·vue·html
小桥风满袖1 小时前
极简三分钟ES6 - 模块化
前端·javascript