el-date-picker 封装一个简单的日期组件, 主要是禁用日期

news2024/11/28 21:32:53

子组件

<template>
    <div>
        <el-date-picker
        v-model="dateModel"
        type="datetimerange"
        :picker-options="pickerOptions"
        range-separator="至"
        ref="picker"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        :default-time="defaultTime"
      />
    </div>
</template>

<script>
// 定义一天的毫秒数
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
export default {
    props: {
        // 日期范围值
        value: {
            type: Array,
            default: () => []
        },
        // 选择的日期范围限制
        limit: {
            type: Number,
            default: Infinity
        },
        // 是否禁止选择当前日期之后的日期
        disableCurrentDateLater:{
            type:Boolean,
            default: false
        },
        // 只能选择当前日期之前的天数限制
        daysLimit: {
            type: Number,
            default: Infinity
        },
        // 是否显示快捷选项
        showShortcuts:{
            type:Boolean,
            default: true
        },
        // 默认开始和结束时间的时分秒
        defaultTime:{
            type: Array,
            default: () => (['00:00:00', '23:59:59'])
        }
    },
    data() {
        return {
            // 日期选择器的选项
            pickerOptions: {
                onPick: this.handlePick,
                disabledDate: this.isDisabledDate,
                shortcuts: this.showShortcuts ? this.getShortcuts() : [],
            },
        };
    },
    methods: {
        // 处理日期选择
        // 当选择的最小日期存在时,如果已经存在pickerMinDate,则将其置空;如果不存在pickerMinDate,则将选择的最小日期赋值给pickerMinDate
        handlePick({ minDate }) {
            const now = new Date();
            now.setSeconds(0, 0); // 清除秒和毫秒
            if (minDate && this.pickerMinDate) {
                this.pickerMinDate = null;
            } else if (minDate) {
                this.pickerMinDate = minDate.getTime();
            }
        },
        // 判断日期是否被禁用
        // 如果pickerMinDate存在,则判断日期是否超出范围或者在当前日期之后;如果pickerMinDate不存在,则判断日期是否在30天前或者在当前日期之后
        isDisabledDate(time) {
            const now = new Date();
            const thirtyDaysAgo = now.getTime() - this.daysLimit * ONE_DAY_MS;
            if (this.pickerMinDate) {
                return this.isDateOutOfRange(time, thirtyDaysAgo, this.pickerMinDate) || this.isDateAfterNow(time, now);
            }
            return time.getTime() < thirtyDaysAgo || this.isDateAfterNow(time, now);
        },

        // 判断日期是否超出范围
        // 如果日期在pickerMinDate的limit天之后,或者在pickerMinDate的limit天之前,或者在30天前,则返回true,表示日期超出范围
        isDateOutOfRange(time, thirtyDaysAgo, pickerMinDate) {
            const limitTime = this.limit * ONE_DAY_MS;
            return (time.getTime() > (pickerMinDate + limitTime)) || (time.getTime() < (pickerMinDate - limitTime)) || time.getTime() < thirtyDaysAgo;
        },

        // 判断日期是否在当前日期之后
        isDateAfterNow(time, now) {
            return this.disableCurrentDateLater && time.getTime() > now.getTime();
        },

        // 获取快捷选项
        getShortcuts() {
            return [{
                text: '最近一周',
                onClick: this.getShortcutPicker(7)
            }, {
                text: '最近一个月',
                onClick: this.getShortcutPicker(30)
            }, {
                text: '最近三个月',
                onClick: this.getShortcutPicker(90)
            }];
        },
        // 获取快捷选项的日期范围
        getShortcutPicker(days) {
            return (picker) => {
                const end = new Date();
                const start = new Date();
                start.setTime(start.getTime() - days * ONE_DAY_MS);
                picker.$emit('pick', [start, end]);

            };
        },
    },
    computed: {
        // 日期模型,用于v-model双向绑定
        dateModel: {
            get() {
                return this.value ? this.value.map(date => new Date(date)) : [];
            },
            set(val) {
                if (val) {
                    this.$emit('input', val.map(date => date.getTime()));
                } else {
                    this.$emit('input', null);
                }
            }
        }
    },
};
</script>

父组件

<template>
  <div id="app">
     <!--
          disableCurrentDateLater  当前时间之后的日期是否禁止选择
          limit 选择的范围: 比如: 只能选1月1日前后的30天 ,这里就传30
          daysLimit 只能选择当前时间之前的多少天
      -->
            <myDatePicker
                v-model="date"
                :limit="10"
                :daysLimit="30"
                disableCurrentDateLater
            />
  </div>
</template>

<script>
import myDatePicker from './components/myDatePicker'
export default {
  name: 'App',
  components: {
    myDatePicker,
  },
  data() {
    return {
      date: [],
    }
  },
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-消融实验

深度学习中消融实验的目的 深度学习中&#xff0c;消融实验是一种用于理解和评估神经网络模型的技术。它的主要目的是通过逐步删除神经网络的某些组件或功能&#xff0c;来研究它们对模型性能的影响。通过这种方式&#xff0c;我们可以深入了解模型的工作原理、探索模型的鲁棒性…

第31章_瑞萨MCU零基础入门系列教程之WIFI蓝牙模块驱动实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

【毕业设计】基于SSM的仓库进存销系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;本系统结构简单&#xff0c;容易理解&#xff01;本系统功能结构完整&#xff0c;非常高适…

下载HTMLTestRunner并修改

目录 一. 下载HTMLTestRunner 二. 修改HTMLTestRunner 1. 修改内容 2. 修改原因 一. 下载HTMLTestRunner 下载报告模板地址:http://tungwaiyip.info/software/HTMLTestRunner.html 下载模块&#xff1a; 二. 修改HTMLTestRunner 将修改后的模块放到python安装目录下的..…

【Mysql学习笔记】关键字顺序以及执行顺序

关键字顺序&#xff08;如上&#xff09;&#xff1a; SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...关键字执行顺序&#xff08;如上&#xff09;&#xff1a; FROM > WHERE > GROUP BY > HAVING > SELECT的字段 > DISTINCT > ORD…

解决java.io.IOException: Network error

解决java.io.IOException: Network error 解决java.io.IOException: Network error摘要引言正文1. 理解异常的根本原因2. 处理网络连接问题3. 处理连接超时4. 处理协议错误或不匹配5. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#…

Redis从入门到精通(二:数据类型)

数据存储类型介绍 Redis 数据类型&#xff08;5种常用&#xff09; string hash list set sorted_set/zset&#xff08;应用性较低&#xff09; redis 数据存储格式 redis 自身是一个 Map&#xff0c;其中所有的数据都是采用 key : value 的形式存储 数据类型指的是存储的数据…

使用html展示中秋节快乐的脚本

#【中秋征文】程序人生&#xff0c;中秋共享# html代码如下所示&#xff1a; <!DOCTYPE html> <html> <head> <title>中秋节</title> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 20px; } h1 { c…

AutoSAR配置与实践(实践篇)13.6 如何添加一个NVM BLOCK (PIM类型)

AutoSAR配置与实践&#xff08;实践篇&#xff09;13.1 如何添加一个NVM BLOCK 如何添加一个NVM BLOCK &#xff08;PIM类型&#xff09;一、PIM&#xff08;PerInstanceMemory&#xff09;简介二、PIM添加步骤2.1 总体思路2.2 DEV工程步骤2.3 CFG工程步骤 如何添加一个NVM BLO…

用 Github Codespaces 免费搭建本地开发测试环境

如何丝滑地白嫖一个本地开发环境&#xff1f;怎么新建一个代码空间&#xff1f; 1&#xff1a;通过Github网页新建2&#xff1a;通过VSCode插件新建 为代码创建相应的开发测试环境 如何丝滑地白嫖一个本地开发环境&#xff1f; 使用Codespaces为开发者解决这样的痛点&#xf…

安装chromadb遇到的问题与python3升级

环境&#xff1a; python 3.10 &#xff0c; centos 7.x 使用 pip3 install chromadb 时&#xff0c;遇到以下问题。 问题1: gcc note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for chroma-hnswlib F…

《PostgreSQL与MySQL:详细对比与分析》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

【Java 基础篇】Java 比较器排序:精通自定义对象排序

在 Java 编程中&#xff0c;排序是一个非常常见且重要的操作。Java 提供了多种排序机制&#xff0c;其中之一就是使用比较器&#xff08;Comparator&#xff09;进行排序。比较器允许您自定义对象的排序方式&#xff0c;使您能够实现各种排序需求&#xff0c;从简单的对象排序到…

stm32---定时器输入捕获

一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能&#xff0c;输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7&#xff0c;其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿&#xff0c;下降沿或者双边沿进行捕获&#xf…

分享一个基于微信小程序的医院口腔助手小程序 牙科诊所预约小程序 源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

摘要&#xff1a; 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试&#xff0c;并提供详细的代码示例和操作步骤。希望能对读者有所启发和帮助。 前言 随着移动互联网的快速发展&#xff0c;越来越多的应用程序采用Web API&#xff08;也称为RESTful API&…

记录selenium和chrome使用socks代理打开网页以及查看selenium的版本

使用前&#xff0c;首先打开socks5全局代理。 之前我还写过一篇关于编程中使用到代理的情况&#xff1a; 记录一下python编程中需要使用代理的解决方法_python 使用全局代理_小小爬虾的博客-CSDN博客 在本文中&#xff0c;首先安装selenium和安装chrome浏览器。 参考我的文章…

无涯教程-JavaScript - INFO函数

描述 INFO函数返回有关当前操作环境的信息。 语法 INFO (type_text) 争论 Argument描述Required/OptionalType_text 指定要返回的信息类型的文本。 下表给出了Type_text的值和相应的返回信息。 Required Type_text 返回的信息"目录" 当前目录或文件夹的路径。&qu…

ELK学习笔记1:简介及安装

ELK学习笔记1&#xff1a;简介及安装 ELK的简介 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Filebeat占用资源少&a…

LeetCode-热题100-笔记-day27

2. 二叉树的层序遍历https://leetcode.cn/problems/binary-tree-level-order-traversal/ 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3…