element-ui使用el-date-picker日期组件常见场景

element,ui,el,date,picker · 浏览次数 : 0

小编点评

**解决方法:** 1. **限制`disabledDate`的条件**:修改 `disabledDate` 的条件,只允许用户选择与当天距离不超过 7 天的日期。 ```js disabledDate: time => { return time.getTime() - Date.now() <= 7 * 24 * 60 * 60 * 1000; } ``` 2. **更新`pickerOptions`**:根据选择的日期,更新 `pickerOptions` 的 `disabledDate` 和 `minDate` 属性,使其只允许选择与当天距离不超过 7 天的日期。 ```js onPick: date => { // Update pickerOptions this.pickerOptions.disabledDate = date.minDate; this.pickerOptions.minDate = date.getTime() - 7 * 24 * 60 * 60 * 1000; } ``` **完整代码:** ```js data() { return { pickerOptions: { disabledDate: time => time.getTime() - Date.now() <= 7 * 24 * 60 * 60 * 1000, minDate: time.getTime() - 7 * 24 * 60 * 60 * 1000, }, // Other code... }; }, // Other code... ``` **注意:** * `minDate` 属性的设置应该大于等于 `disabledDate` 属性的设置。 * 此代码假设用户选择的日期是 `Date` 类型。如果使用 `String` 类型的用户选择日期,则需要进行类型转换。

正文

开始

最近一直在使用 element-ui中的日期组件。
所以想对日期组件常用的做一个简单的总结;
1.处理日期组件选择的时候面板联动问题 
2.限制时间范围

解除两个日期面板之间的联动

我们发现2个日期面板之间其实是有联动关系的;
开始时间面板和结束时间面板始终只能相邻;
不能出现开始时间选择3月,结束时间是5月这样的情况;
但是我们有些时候要让他们之间解除联动关系;
我们需要将 unlink-panels 设置为true

unlink-panels:在范围选择器里取消两个日期面板之间的联动;
它默认是false;我们设置为true就行

限制-选择今天以及今天之后的时间

<template>
  <div>
    <el-date-picker
      v-model="value2"
      type="datetimerange"
      range-separator="至"
      :picker-options="pickerOptions"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      align="right">
    </el-date-picker>
  </div>
</template>
<script>
export default {
  data() {
    return {
      pickerOptions: { 
         disabledDate(time) {
          // time 表示的是面板中每一个日期值
          // 只能选择今天以及今天之后的时间
          return time.getTime() < Date.now() - 24*60*60*1000;
         }
      },
      value2: ''
    }
  }
}
</script>

8.64e7 约等于24小时

有的小伙伴说:我看见有些限制时间是这样写的
return time.getTime() < Date.now() - 8.64e7
其实8.64e7 约等于24小时;所以并不会影响

限制-只能选择今天之后的时间

pickerOptions: { 
    disabledDate(time) {
      // 只能选择今天之后的时间
      // time 表示的是面板中每一个日期值
      return time.getTime() < Date.now()
    }
},

限制-选择今天以及今天之前的时间

pickerOptions: { 
  disabledDate(time) {
    // 选择今天以及今天之前的时间
    // time 表示的是面板中每一个日期值
    return time.getTime()  > Date.now();
  }
},

限制-选择今天之前的时间

pickerOptions: { 
  disabledDate(time) {
    // 选择今天之前的时间
    // time 表示的是面板中每一个日期值
    return time.getTime() > Date.now() -  24*60*60*1000;
  }
},

限制-选择当前时间以及当前之前的7天的时间

<el-date-picker
  v-model="value2"
  type="datetimerange"
  range-separator="至"
  :picker-options="pickerOptions"
  start-placeholder="开始日期"
  end-placeholder="结束日期"
  align="right">
</el-date-picker>

 data() {
    return {
      pickerOptions: {  
        disabledDate(time) {  
          // 获取当前的时间
          let currentTime = new Date()
          // 重新设置当前时间的 时,分,秒,毫秒
          currentTime.setHours(0,0,0,0)
          // 得到当前时间 0时0分0秒的时间戳
          let endTime = currentTime.getTime()
          // 获取7天前的时间戳
          let startTime = endTime - 6*24*60*60*1000
          // time表示需要需要禁用的时间
          return  time.getTime() < startTime || time.getTime() > endTime
        },  
      },
      value2: ''
    }
  }

限制-时间不能超过当前时间,时间跨度不能超过30天

经过前面我们的学习,我们可以通过
time.getTime()  > Date.now();
来限制时间不能超过当前时间;
时间跨度我们通过 change 事件来判断开始时间和结束时间是否相差30天
于是我们很快完成了功能
<template>
  <div>
    <el-date-picker
      v-model="value2"
      type="datetimerange"
      @change="changeTime"
      range-separator="至"
      :picker-options="pickerOptions"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      align="right">
    </el-date-picker>
  </div>
</template>
<script>

export default {
  data() {
    return {
      pickerOptions: {  
        disabledDate(time) {  
          // 选择今天以及今天之前的时间 
          return time.getTime()  > Date.now();
        },  
      },  
      value2: ''
    }
  },
  methods:{
    changeTime(time){
      if(time && time.length){
        let endTime = time[1].getTime()
        let startTime = time[0].getTime()
        let limitTime= 30 *24 *60*60*1000
        if(endTime - startTime > limitTime){
          this.$message.error('选择的时间不能超过30天');
          this.value2 = ''
        }
      }else {
        this.$message.error('请选择时间');
      }
    }
  }
}
</script>

发现问题

虽然我们上面的代码实现了功能;但是用户体验不是特别不好;
有没有这样的方式:当用户选择了5月2号;
只能选择它的前30天和后30天范围的时间(4月2号---6.20号)
如果要实现上面这样的功能:
1.我们要解决面板联动,可以使用 unlink-panels 来解决;
2.我们要知道用户点击选择的时间,这样我们才能知道开始和结束;
  这样问题我们可以使用 onPick: date => { }事件知道点击选中的时间
3.计算出30天前和30天后的时间

选择的时间范围不超过7天(为了好演示)

<template>
  <div>
    <el-date-picker v-model="myTime" unlink-panels type="datetimerange" range-separator="至"
      :picker-options="pickerOptions" start-placeholder="开始日期" end-placeholder="结束日期" align="right">
    </el-date-picker>
  </div>
</template>
<script>

export default {
  data() {
    return {
      pickerOptions: {
        disabledDate: time => {
          // this.userSelectDate 可能是 '',不是一个日期对象;
          // 这个必须要使用括号哈 
          // 如果使用 !this.userSelectDate instanceof Date 仍然是false
          if (!(this.userSelectDate instanceof Date)) {
            return false
          } else {
            let currentTime = time.getTime()
            let userSelectDateTime = this.userSelectDate.getTime()
            // 获取7天前的时间戳
            let day7beforeTime = userSelectDateTime - 6*24*60*60*1000
            // 获取7天后的时间戳
            let day7AfterTime = userSelectDateTime + 6*24*60*60*1000
            // 只能选择 7天前和7天后
            return currentTime > day7AfterTime || currentTime < day7beforeTime
          }
        },
        onPick: date => {
          // minDates就是用户选择的初始时间,记录它是为了得到7天前和7天后的时间
          console.log('用户选择时间就是触发', date)
          if (date.minDate) {
            // 记录用户选择的时间
            this.userSelectDate = date.minDate
          } else {
            this.userSelectDate = null
          }
        }
      },
      userSelectDate: '',
      myTime:''
    }
  }
}
</script>


又又发现了问题

上面虽然友好的实现了限制选择的时间前后不超过7天;
但是没有限制选择的时间【不能】选择今天之后的时间;
我们需要限制一下;
除了 pickerOptions 中的代码,其他的与上面的一样保持不变

选择的时间范围不超过7天,同时选择的时间不能选择今天之后的时间

pickerOptions: {
  disabledDate: time => {
    console.log(11111111111)
    // 限制不能选择今天之后的时间
    if( Date.now() < time.getTime()){
      return true;
    }else {
      // this.userSelectDate 可能是 '',不是一个日期对象;
      // 这个必须要使用括号哈 
      // 如果使用 !this.userSelectDate instanceof Date 仍然是false
      if (!(this.userSelectDate instanceof Date)) {
        return false
      } else {
        let currentTime = time.getTime()
        let userSelectDateTime = this.userSelectDate.getTime()
        // 获取7天前的时间戳
        let day7beforeTime = userSelectDateTime - 6*24*60*60*1000
        // 获取7天后的时间戳
        let day7AfterTime = userSelectDateTime + 6*24*60*60*1000
        // 只能选择 7天前和7天后
        return currentTime > day7AfterTime || currentTime < day7beforeTime
      }
    }
  }
},


尾声

没有想到五一这么快就结束了;
用了2天时间看完了遮天;
主角是古今第一圣体,荒古圣体;
我是牛马圣体;不说了,开始干活

与element-ui使用el-date-picker日期组件常见场景相似的内容:

element-ui使用el-date-picker日期组件常见场景

开始 最近一直在使用 element-ui中的日期组件。 所以想对日期组件常用的做一个简单的总结; 1.处理日期组件选择的时候面板联动问题 2.限制时间范围 解除两个日期面板之间的联动 我们发现2个日期面板之间其实是有联动关系的; 开始时间面板和结束时间面板始终只能相邻; 不能出现开始时间选择3月,

02.前后端分离中台框架前端 admin.ui.plus 学习-介绍与简单使用

## 中台框架前台项目 admin.ui.plus 的初识 > 基于 vue3.x + CompositionAPI setup 语法糖 + typescript + vite + element plus + vue-router-next + pinia 技术,内置支持一键生成微服务接口,适配手

Element-ui源码解析(一):项目目录解析

开始看原码了,我们要开始一些准备工作, 既然是拆代码,那么我们要先把代码搞到手 1.如何下载原码 随便开个项目 npm i element-ui -S 将源码下载到本地 随后在node_modules中找到element-ui文件夹 开搞 2.目录结构解析 目录结构如下: 1.lib:该目录包含了

Element-ui源码解析(二):最简单的组件Button

好家伙,为了有足够的能力去开发组件,先研究一下别人的组件 开始抄袭模仿我们的行业标杆element-ui 找到Button组件的源码 只有三个文件,看上去非常易读,开搞 其中最重要的部分,自然是button.vue

element-ui源码修改记录

## 1、介绍 本项目是基于element-ui@2.15.14的基础上,二次修改源码,封装的ui组件,在此特别感谢[elemen-ui组件库](https://github.com/ElemeFE/element) ## 2、更新功能 ### 2.1在el-cascader组件的基础上,添加了只多

WPF实现Element UI风格的日期时间选择器

### 背景 业务开发过程中遇到一个日期范围选择的需求,和Element UI的DateTimePicker组件比较类似,由两个日历控件组成,联动选择起始时间和结束时间。 ### 问题 WPF中提供了一个`DatePicker`的控件,主要由`DatePickerTextBox`、`Button`和

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S

我的第一个项目(十四) :完成数据保存功能(前端,增查改接口)

好家伙,天天拖,终于写完了 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee

我的第一个项目(十五) :完成数据保存功能(后端,改update)

好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: mysql 目前实现功能: 1.注册登陆 2.游戏数据保存 3.游戏运行 (gitee.com) 后端这

CAS前后端分离解决方案

CAS前后端分离解决方案 关于CSS服务器的搭建和整合SpringBoot参考:CAS5.3服务器搭建与客户端整合SpringBoot以及踩坑笔记 环境与需求 后端:springboot 前端: vue + element UI 在登录后之后登录状态在系统中自主控制。 问题 当接口在CAS过滤器中时