vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题

在Vue中使用Element UI的日期选择组件 <el-date-picker>,当你清空所选时间时,组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为,它将清空所选日期后将其视为 null。但有时后端不允许日期传空。

 因此,可以考虑使用自定义函数来处理日期选择器的值,然后根据需要进行相应的处理。

方法一:

你可以使用 :value@change 这两个属性来控制日期选择器的行为。下面是一个简单的例子:
<template>
  <el-date-picker
    v-model="pickedDate"
    type="date"
    placeholder="选择日期"
    :value="pickedDate"
    @change="handleDateChange"
  ></el-date-picker>
</template>

<script>
export default {
  data() {
    return {
      pickedDate: null // 你的日期数据
    };
  },
  methods: {
    handleDateChange(value) {
      // 当日期改变时的处理函数
      // 在这里你可以根据需要处理日期的值
      // 例如,如果不想让清空操作将日期设置为null,可以在这里进行判断
      if (!value) {
        // 当清空日期时,不更新pickedDate,保持原值
        return;
      }

      // 如果需要在清空时设置日期为特定值(比如空字符串),可以在此处设置
      // this.pickedDate = value;

      // 在其他情况下,将值更新为选择的日期
      this.pickedDate = value;
    }
  }
};
</script>

 在上面的例子中,handleDateChange 方法会接收日期选择器选择的值。你可以在这个方法中根据需求进行逻辑处理。如果选择器的值为空(清空操作),你可以决定保持 pickedDate 不变,或者设置为特定值而不是 null

方法二:

el-date-picker绑定value,当点击x时会将value的值改为null,重新赋值时 会报错,解决方案:

        watch: {
            value1(val, oldVal) {
                if (!val) {
                    this.value1 = new Date()
                }
            }
        },

监听value的值并且判断新值,如果新值为null,就证明点击了x号,这时候给value赋一个值就可以解决报错。

二、具体问题

我遇到的问题是,需求需要可以只选择开始日期,也可以只选择截止日期。因此组件是由两个“选择日”组件构成type="date"如下图:

而不是由一个“选择日期范围”组件type="daterange":

因此,需要做:

1.限制起始日期小于截止日期

1)根据用户选中的开始日期,置灰不可选的日期范围;

2)如果用户先选择截止日期,再选择的开始日期,且开始日期大于截止日期,清空截止日期;

2.处理点击日期控件的清除按钮后,传值未null情况

1)用了监听的方法;

3.由于我一个页面中有多个日期选择器el-date-picker,对应不同的v-model字段,所以写了一个公共组件来处理

<el-form-item label="处理日期"  label-width="70px">
            <el-date-picker
              v-model="formSearch.dateBegin"
              type="date"
              placeholder="选择日期"
              value-format="yyyy-MM-dd"
              style="width: 167px"
              @change="validateDateRange('dateBegin','dateEnd')"
            ></el-date-picker
            >至
            <el-date-picker
              v-model="formSearch.dateEnd"
              type="date"
              placeholder="选择日期"
              value-format="yyyy-MM-dd"
              style="width: 167px"
              @change="validateDateRange('dateBegin','dateEnd')"
              :picker-options="getPickerOptions('dateBegin')"
            ></el-date-picker>
          </el-form-item>




逻辑:

  methods: {
    //日期选择限制
    getPickerOptions(startField) {
      const startDate = new Date(this.formSearch[startField]);
      return {
        disabledDate: (time) => {
          return time.getTime() < startDate.getTime();
        },
      };
    },
    //选择日期时触发
    validateDateRange(startField,endField) {
      this.pickerOptions[startField] = this.getPickerOptions(startField);
      const startDate = new Date(this.formSearch[startField]);
      const endDate = new Date(this.formSearch[endField]);
      if (endDate < startDate) {
        // 如果截止日期早于开始日期,更新截止日期为开始日期之后的日期
        this.formSearch[endField] = '';
      }
      this.watchField(startField, endField);
    },
    //监听,如果传值是null,改为后端需要的字符串‘’
    watchField(startField, endField) {
      this.$watch(
        () => [this.formSearch[startField], this.formSearch[endField]],
        ([newStart, newEnd], [oldStart, oldEnd]) => {
          if (newStart === null || newStart === '') {
            console.log('开始日期为空');
            this.formSearch[startField] = ''; // 将开始日期设置为空字符串
          }
          if (newEnd === null || newEnd === '') {
            console.log('结束日期为空');
            this.formSearch[endField] = ''; // 将结束日期设置为空字符串
          }
        },
        { deep: true }
      );
    },
}

4.解释一下picker-options:

picker-options 是 Element UI 中某些组件的一个属性,它允许自定义日期选择器、时间选择器、颜色选择器等组件的行为和显示方式。

这个属性可以用来传递一些选项对象,以控制选择器的行为,比如在日期选择器中可以用来限制可选日期范围、禁用某些日期等。

picker-options 通常是一个对象,包含了一系列可以配置的选项。这些选项可以因不同的组件而异,以下是一些常见的选项用法示例:

  • 日期选择器(DatePicker):

    • disabledDate:用于禁用不可选的日期。可以是一个函数,接收当前日期作为参数,根据函数返回值 truefalse 来决定是否禁用该日期。
    • shortcuts:设置快捷选项,例如 "今天"、"昨天"、"最近一周" 等。
  • 时间选择器(TimePicker):

    • selectableRange:限制可选时间范围。可以提供一个数组,表示允许选择的时间范围。
  • 颜色选择器(ColorPicker):

    • predefine:预定义颜色。

5.时间戳

.getTime() 是 JavaScript 中 Date 对象的一个方法,用于获取该日期对象表示的时间戳,以毫秒为单位。这个方法返回一个数值,表示从特定的起始时间(通常是1970年1月1日格林威治时间午夜)到该日期时间的毫秒数。这个数值就是时间戳。

这个时间戳可以用于进行日期时间的比较、计算时间间隔等操作。

const currentDate = new Date(); // 创建一个表示当前时间的 Date 对象
const timestamp = currentDate.getTime(); // 获取当前时间的时间戳
console.log(timestamp); // 输出当前时间的时间戳

比较时间有两种方法,一个是 new Date()成时间对象进行比较,另一个是.getTime()时间戳比较。

1. 使用 Date 对象进行比较:

您可以使用 Date 对象来表示日期和时间,然后直接对这些对象进行比较。例如,您可以使用 new Date() 创建日期对象,然后使用比较运算符(如 <, >, <=, >=)直接比较这些对象。

const date1 = new Date('2022-10-01');
const date2 = new Date('2023-02-05');

if (date1 < date2) {
  console.log('date1 在 date2 之前');
} else if (date1 > date2) {
  console.log('date1 在 date2 之后');
} else {
  console.log('date1 和 date2 相等');
}

2. 使用时间戳进行比较:

另一种方法是将日期对象转换为时间戳,然后比较这些时间戳。您可以使用 getTime() 方法获取日期对象的时间戳,并使用比较运算符对时间戳进行比较。

const date1 = new Date('2022-10-01');
const date2 = new Date('2023-02-05');

const timestamp1 = date1.getTime();
const timestamp2 = date2.getTime();

if (timestamp1 < timestamp2) {
  console.log('date1 在 date2 之前');
} else if (timestamp1 > timestamp2) {
  console.log('date1 在 date2 之后');
} else {
  console.log('date1 和 date2 相等');
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/246115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

生产实践:基于K8S的私有化部署解决方案

随着国内数字化转型的加速和国产化进程推动&#xff0c;软件系统的私有化部署已经成为非常热门的话题&#xff0c;因为私有化部署赋予了企业更大的灵活和控制权&#xff0c;使其可以根据自身需求和安全要求定制和管理软件系统。下面分享下我们的基于k8S私有化部署经验。 私有化…

AR眼镜光学方案_AR眼镜整机硬件定制

增强现实(Augmented Reality&#xff0c;AR)技术通过将计算机生成的虚拟物体或其他信息叠加到真实世界中&#xff0c;实现对现实的增强。AR眼镜作为实现AR技术的重要设备&#xff0c;具备虚实结合、实时交互的特点。为了实现透视效果&#xff0c;AR眼镜需要同时显示真实的外部世…

【WebRTC】用WebRTC做即时视频聊天应用

【配套项目源码】 打开即用,设置一个免费的Agora账户就可以实现视频电话。非常好的WebRTC学习和应用项目。 用VSCode打开即可。 https://download.csdn.net/download/weixin_41697242/88630069 【什么是WebRTC?】 WebRTC是一套基于JS的API,能够建立端对端的直接通信,实…

服务器上配置jupyter,提示Invalid credentials如何解决

我是按照网上教程在服务器上安装的jupyter以及进行的密码配置&#xff0c;我利用 passwd()这个口令生成的转译密码是"argon...."。按照教程配置jupyter notebook配置文件里面的内容&#xff0c;登陆网页提示"Invalid credentials"。我谷歌得到的解答是&…

如何学习Kubernetes,学习K8S入门教程

学习 Kubernetes&#xff08;K8s&#xff09;确实不容易 你的硬件资源有限时&#xff0c;不过别担心&#xff0c;我帮你理清思路&#xff0c;让你在学习 K8s 的路上更加从容。 1、资源限制下的学习方法 当硬件资源有限时&#xff0c;一个好的选择是使用云服务提供的免费层或者…

✺ch2——OpenGL图像管线

目录 基于C图形应用&#xff06;管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…

蓝牙物联网智慧物业解决方案

蓝牙物联网智慧物业解决方案是一种利用蓝牙技术来提高物业管理和服务效率的解决方案。它通过将蓝牙技术与其他智能设备、应用程序和云服务相结合&#xff0c;为物业管理和服务提供更便捷、高效和智能化的支持。 蓝牙物联网智慧物业解决方案包括&#xff1a; 1、设备管理&#…

【Qt QML入门】TextInput

TextInput&#xff1a;单行文本输入框。 TextInput除了光标和文本外&#xff0c;默认没有边框等效果。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: truetitle: qsTr("Hello World")//单行文本输…

Vue2.x源码:new Vue()做了啥

例子1new Vue做了啥?new Vue做了啥,源码解析 initMixin函数 初始化 – 初始化Vue实例的配置initLifecycle函数 – 初始化生命周期钩子函数initEvents – 初始化事件系统初始化渲染 initRender初始化inject选项 例子1 <div id"app"><div class"home&…

C_11练习题答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 以下叙述中正确的是(C)A.C语言不是一种高级语言 B.C语言不用编译就能被计算机执行 C.C语言能够直接访问物理地址和进行位…

计算机设计大赛信息可视化设计的获奖经验剖析解读—基于本专栏文章助力4C大赛【全网最全万字攻略-获奖必读】

文章目录 一.中国大学生计算机设计大赛1.1赛道解读1.2 信息可视化设计小类介绍1.2 小类区别解读 二.信息可视化设计赛道获奖经验2.1 四小类作品预览2.1.1 数据可视化小类-优秀参赛作品展览2.1.2 信息图形设计小类-优秀参赛作品展览2.1.3 动态信息影像&#xff08;MG动画&#x…

css3 clip-path剪切图片

大致看了一下&#xff0c;反正以后用到就慢慢调吧 剪切四个角 clip-path: polygon(14px 0, calc(100% - 14px) 0, 100% 14px, 100% calc(100% - 14px), calc(100% - 14px) 100%, 14px 100%, 0 calc(100% - 14px), 0 14px); 三角形 clip-path: polygon(50% 0,0 100%, 100% 100…

ShardingSphere数据分片之读写分离

1、概述 读写分离是一种常见的数据库架构&#xff0c;它将数据库分为主从库&#xff0c;一个主库&#xff08;Master&#xff09;用于写数据&#xff0c;多个从库&#xff08;Slave&#xff09;进行轮询读取数据的过程。主从库之间通过某种通讯机制进行数据的同步。 所以&…

【视觉SLAM十四讲学习笔记】第四讲——李代数求导与扰动模型

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

《PCL多线程加速处理》-滤波-统计滤波

《PCL多线程加速处理》-滤波-统计滤波 一、效果展示二、实现方式三、代码一、效果展示 提升速度随着点云越多效果越明显 二、实现方式 1、原始的统计滤波实现方式 #include <pcl/filters/statistical_outlier_removal.h>pcl::PointCloud<pcl::PointXYZ

pr模板哪个网站好?免费Pr模板视频素材下载网站 Prmuban.com

pr模板哪个网站好&#xff1f;哪里可以下载免费的pr模板视频素材&#xff0c;PR模板网&#xff08;Prmuban.com&#xff09;影视后期制作模板视频剪辑素材资源网站。 包含PR模板、PR插件、PR预设、MOGRT、LUT、转场特效、音乐素材、音效素材等&#xff0c;更好的剪辑师必备资源…

【jmeter】接口测试流程

1、Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目&#xff0c;即可以用于做接口测试也可以用于做性能测试。 Jmeter具备高移植性&#xff0c;可以实现跨平台运行。 Jmeter可以实现分布式负载。 Jmeter采用多线程&#xff0c;允许通过多个线程并发取样或通过独…

Windows中使用pthread线程库

由于时间成本&#xff0c;不想使用Windows线程API&#xff0c;因此想用pthread线程库&#xff1b;但pthread是Linux默认的POSIX线程库&#xff0c;Windows中并不自带&#xff0c;需要自己配置。 因为pthread遵循POSIX标准&#xff0c;因此其在Windows中使用应该和Linux中大同小…

UDP特性之广播

UDP特性之广播 1. 广播的特点2. 设置广播属性3. 广播通信流程4. 通信代码总结 1. 广播的特点 广播的UDP的特性之一&#xff0c;通过广播可以向子网中多台计算机发送消息&#xff0c;并且子网中所有的计算机都可以接收到发送方发送的消息&#xff0c;每个广播消息都包含一个特殊…

Clickhouse RoaringBitmap

https://blog.csdn.net/penriver/article/details/119736050 https://juejin.cn/post/7179956435806076988 BitMap适合连续密集的正整数存储&#xff0c;对于稀疏的正整数存储&#xff0c;其性能在很多时候是没办法和int数组相比的&#xff0c;尤其是正整数跨度较大的场景&…