el-date-picker 根据第一个时间选择框 让第二个时间选择框禁用日期时间并精确到时分秒

当前有个需求:两个时间选择框是分开的,需要根据第一个时间选择框选择的时间(精确到时分秒),让第二个时间选择框禁用掉第一个时间选择框之前的时间。

 也就是假设我现在第一个时间框选择的是2022年7月8号 下午两点,那么第二个时间框就要禁用掉在这之前的时间,精确到时分秒(只是我这里没显示秒)。

看效果图,在这之前的小时都被禁用了。

下面看实现的代码:

<el-date-picker v-model="ruleForm.startTime" type="datetime" value-format="yyyy-MM-dd         
   HH:mm" format="yyyy-MM-dd HH:mm" :picker-options="pickerOptionsOne" placeholder="请选择 
   开始时间" style="width: 100%" clearable>
</el-date-picker>
<el-date-picker v-model="ruleForm.endTime" type="datetime" value-format="yyyy-MM-dd HH:mm" 
   format="yyyy-MM-dd HH:mm" :picker-options="pickerOptionsTwo" placeholder="请选择结束时间" 
   style="width: 100%" clearable>
</el-date-picker>
data() {
    return {
        ruleForm:{
            startTime: '', // 开始时间
            endTime: '', // 结束时间
        },
        // 禁用今天之前的时间
        pickerOptionsOne: {
            disabledDate(time) {
                return time.getTime() < Date.now() - 8.64e7
            },
        },
        // 禁用今天之前的时间 + 禁用第一个时间选择框选择的小时之前的时间
        pickerOptionsTwo: {
            selectableRange: [],
            disabledDate(time) {
                return time.getTime() < Date.now() - 8.64e7
            },
        },
    }
},
computed: {
    // 为结束时间的禁用做处理:选择了开始时间后禁用在这之前的时间
    startTime() {
        // 如果开始时间的选择框不为空,则使用选择的时间,否则用当前的时间
        let data = this.ruleForm.startTime ? new Date(this.ruleForm.startTime) : new Date()
        let hour = data.getHours()
        let minute = data.getMinutes()
        let second = data.getSeconds()
        return [`${hour}:${minute}:${second} - 23:59:59`]
    },
    // 监听结束时间的处理  如果和开始时间是同一天,则把开始时间选择的小时禁用,如果是后面的日期,则不禁用小时
    endTime() {
        // 开始时间  取年份到日期 不要时分秒
        let startTime = this.ruleForm.startTime ? new Date(this.ruleForm.startTime.split(' ')[0]) : new Date()
        // 结束时间  取年份到日期 不要时分秒
        let endTime = this.ruleForm.endTime ? new Date(this.ruleForm.endTime.split(' ')[0]) : new Date()
        // 开始时间的 13位时间戳
        let startDate = startTime.getTime()
        // 结束时间的 13位时间戳
        let endDate = endTime.getTime()
        // 返回他俩相减的绝对值
        let differ = Math.abs(endDate - startDate)
        // 求出来相差的天数
        let flagDiffer = differ / (1000 * 24 * 60 * 60)
        // 如果大于0 则代表结束时间选择的是在开始时间之后的日期(天数)
        if (flagDiffer > 0) {
          // 则不禁用
          return ['00:00:00 - 23:59:59']
        }
        // 否则就是和开始时间一样选择的当天
        return this.startTime
      }
},
watch: {
    // 监听计算属性里面的endTime
    endTime: {
        handler: function(val, oldVal) {
            this.pickerOptionsTwo.selectableRange = val
        },
        deep: true,
    }
}

思路:因为项目需要,第一个时间选择框的 pickerOptionsOne 函数是为了禁用掉今天之前的时间;且第一个时间选择框可以随时更改数据,所以在 data 里面的 pickerOptionsTwo 函数不能写死,因此使用计算属性获取第一个时间选择框里面的数据,再用一个计算属性获取第二个时间选择框里面的数据,计算两者之间的天数是否大于1天,大于1天就要把时分秒的禁用给关掉,如果就是当天则把时分秒的禁用给打开(此处很重要,因为不加这个则不管是哪天的日期都会把时分秒禁掉)!!之后使用watch监听计算属性里面的 endTime 函数的更改,当发现数据改变时,就重新把选择的时间写入到pickerOptionsTwo里面。完美解决问题

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值