element-时间选择器单独写两个时间选择器并按照规则进行置灰选择,精确到时分秒

项目场景:

要求:

  • 开始时间和结束时间可以分开搜索,所以组件自带的时间范围选择器不适用
  • 开始时间和结束时间超过当前时间置灰不可选择
  • 开始时间不可选择结束时间之后的时间
  • 结束时间不可选择开始时间之前的时间

代码实例

javascript 复制代码
 <el-form-item>
        <div class="theme-date">
          <div class="theme-date-prepend">任务开始/结束时间</div>
          <el-date-picker
            type="datetime"
            placeholder="选择任务开始日期"
            :picker-options="pickerOptions"
            value-format="yyyy-MM-dd HH:mm:ss"
            v-model="form.startTime"
          ></el-date-picker>
          <span style="padding: 0 2px">至</span>
          <el-date-picker
            type="datetime"
            placeholder="选择任务结束日期"
            :picker-options="pickerOptions1"
            value-format="yyyy-MM-dd HH:mm:ss"
            v-model="form.endTime"
          ></el-date-picker>
        </div>
      </el-form-item>
javascript 复制代码
data中声明两个参数
startTimeSelectableRange: "00:00:00-23:59:59",
endTimeSelectableRange: "00:00:00-23:59:59",
javascript 复制代码
computed: {
    pickerOptions() {
      const that = this;
      return {
        disabledDate(time) {
          if (that.form.endTime && that.form.endTime !== "") {
            return (
              time.getTime() > new Date(that.form.endTime).getTime() ||
              time.getTime() > new Date()
            );
          }
          return time.getTime() > new Date();
        },
        selectableRange: that.startTimeSelectableRange,
      };
    },
    pickerOptions1() {
      const that = this;
      return {
        disabledDate(time) {
          if (that.form.startTime && that.form.startTime !== "") {
            return (
              time.getTime() + 3600 * 1000 * 24 <
              new Date(that.form.startTime).getTime()
            );
          }
        },
        selectableRange: that.endTimeSelectableRange,
      };
    },
  },

重要的是要对开始时间和结束时间进行监听

javascript 复制代码
 watch: {
    "form.startTime": {
      handler(newVal) {
        // 判断是不是选择的当天,去置灰当天当时当秒之后的置灰操作
        if (
          newVal &&
          new Date(newVal).getFullYear() === new Date().getFullYear() &&
          new Date(newVal).getMonth() === new Date().getMonth() &&
          new Date(newVal).getDate() === new Date().getDate()
        ) {
          this.startTimeSelectableRange = `00:00:00 - ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()}`;
        }
        // 判断是不是选择的结束时间的当天,如果是,那就要将选择的结束时间后的时间进行置灰不可选择
        if (
          this.form.endTime &&
          new Date(newVal).getFullYear() ===
            new Date(this.form.endTime).getFullYear() &&
          new Date(newVal).getMonth() ===
            new Date(this.form.endTime).getMonth() &&
          new Date(newVal).getDate() === new Date(this.form.endTime).getDate()
        ) {
          this.startTimeSelectableRange = `00:00:00 - ${new Date(
            this.form.endTime
          ).getHours()}:${new Date(this.form.endTime).getMinutes()}:${new Date(
            this.form.endTime
          ).getSeconds()}`;
        }
      },
    },
    "form.endTime": {
      handler(newVal) {
        // 判断是不是选择的当天,去置灰当天当时当秒之后的置灰操作
        if (
          newVal &&
          new Date(newVal).getFullYear() === new Date().getFullYear() &&
          new Date(newVal).getMonth() === new Date().getMonth() &&
          new Date(newVal).getDate() === new Date().getDate()
        ) {
          this.endTimeSelectableRange = `00:00:00 - ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()}`;
        }
        // 判断是不是选择的开始时间的当天,如果是,那就要将选择的结束时间前的时间进行置灰不可选择
        if (
          this.form.startTime &&
          new Date(newVal).getFullYear() ===
            new Date(this.form.startTime).getFullYear() &&
          new Date(newVal).getMonth() ===
            new Date(this.form.startTime).getMonth() &&
          new Date(newVal).getDate() === new Date(this.form.startTime).getDate()
        ) {
          this.endTimeSelectableRange = `${new Date(
            this.form.startTime
          ).getHours()}:${new Date(
            this.form.startTime
          ).getMinutes()}:${new Date(
            this.form.startTime
          ).getSeconds()} - 23:59:59`;
        }
      },
    },
  },
相关推荐
爱吃甜品的糯米团子2 分钟前
JavaScript 正则表达式:选择、分组与引用深度解析
前端·javascript·正则表达式
拾忆,想起7 分钟前
TCP滑动窗口:网络世界的“智能流量阀门”
java·网络·数据库·网络协议·tcp/ip·php·哈希算法
摇滚侠11 分钟前
Spring Boot3零基础教程,Reactive-Stream 发布订阅写法,笔记104 笔记105
java·spring boot·笔记
伟大的大威14 分钟前
Android 端离线语音控制设备管理系统:完整技术方案与实践
android·macos·xcode
星尘库19 分钟前
抖音自动化-实现给特定用户发私信
前端·javascript·自动化
Jonathan Star33 分钟前
Next.js、NestJS、Nuxt.js 是 **Node.js 生态中针对不同场景的框架**
开发语言·javascript·node.js
顾安r1 小时前
11.8 脚本网页 推箱子
linux·前端·javascript·flask
Amewin3 小时前
在vue3+uniapp+vite中挂载全局属性方法
javascript·vue.js·uni-app
laplace01233 小时前
Java八股—MySQL
java·mysql·oracle
玖釉-3 小时前
用 Vue + DeepSeek 打造一个智能聊天网站(完整前后端项目开源)
前端·javascript·vue.js