FullCalendar日历组件集成实战(4)

ops/2024/9/23 7:24:26/

背景

有一些应用系统或应用功能,如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件,但功能比较简单,用来做数据展现勉强可用。但如果需要进行复杂的数据展示,以及互动操作如通过点击添加事件,则需要做大量的二次开发。
FullCalendar是一款备受欢迎的开源日历组件,以其强大的功能而著称。其基础功能不仅免费且开源,为开发者提供了极大的便利,仅有少量高级功能需要收费。然而,尽管该组件功能卓越,其文档却相对简洁,导致在集成过程中需要开发者自行摸索与探索,这无疑增加了不少学习和验证的时间成本。
为此,本专栏通过日程管理系统的真实案例,手把手带你了解该组件的属性和功能,通过需求导向的方式,详细阐述FullCalendar组件的集成思路和实用解决方案。
在介绍过程中,我们将重点关注集成要点和注意事项,力求帮助开发者在集成过程中少走弯路,提供有效的避坑指南,从而提升开发效率,更好地利用这款优秀的日历组件

官网:https://fullcalendar.io/
image.png
环境Vue3+Element Plus+FullCalendar 6.1.11。

使用

通过拖动调整起止时间

在各日历视图中,希望通过拖拽的方式,来快速调整起止时间。例如,在日视图中,某个会议延期,由8:30开始顺延到9:30。
日历组件默认事件不可编辑,间接影响到不能拖动,首先需要变更配置。

// 是否可以编辑,影响拖动
editable: true

然后事件就可以拖动了,前端显示起止时间在变,但是刷新页面又会恢复原状,这是因为该拖动只是做了前端的工作,需要调用后端服务,来把数据更新入库。
查找日历组件的触发事件,对应着eventDrop。
配置事件及处理,如下:

//事件拖动结束
eventDrop: this.eventDrop
 // 拖动结束eventDrop(arg) {const task = arg.event// 转换时间格式const startTime = this.$dateFormatter.formatUTCTime(task.start)const endTime = this.$dateFormatter.formatUTCTime(task.end)this.$api.task.task.changeTime(task.id, startTime, endTime)}

通过缩放调整起止时间

上面测试通过拖动来变更起止时间的过程中,发现将鼠标悬停边界,还支持缩放,也就是对应着起止时间范围的放大或缩小,可以将单日的事件横向拖动变成跨越多天,也可以将5小时的事件纵向拖动缩短为2小时。
查找事件,结果有三个:

  • eventResizeStart
  • eventResizeStop
  • eventResize

我们的功能需求不需要细分是起始时间变化还是结束时间变化,因此只需要使用最后一个eventRize就行了。
配置事件如下:

 //缩放事件eventResize: this.eventResize

添加处理,由于缩放和拖动,都是调整起止时间,因此可以完全复用后端处理,做了重构,调用同一个方法,如下:

  // 拖动结束eventDrop(arg) {this.changeTime(arg)},// 缩放结束eventResize(arg) {this.changeTime(arg)},// 变更时间changeTime(arg) {const task = arg.event// 转换时间格式const startTime = this.$dateFormatter.formatUTCTime(task.start)const endTime = this.$dateFormatter.formatUTCTime(task.end)this.$api.task.task.changeTime(task.id, startTime, endTime)}

限制事件最大数量

默认情况下,日历组件不限制单个日历单元格中事件数量,多了会自动扩展高度,如下图所示:
image.png
这种方式个人认为挺不错的,一般情况下,不会有那么多事件把整体表格撑得很大。
为了防止极端情况,仍可以设置一个上限,比如6条或10条,超出的以更多显示。
插一句,日历组件自身的设计真不错,各种情况都考虑到了。

经过资料查阅与验证,有两个参数可以达到目的,一是dayMaxEvents,二是dayMaxEventRows。
设置后,多余的以“+2more”格式显示,效果如下:
image.png
两个参数有细微差别,如都设置为6,前者是6条事件,后者是5条(+2more也算1行)。

注:网上的资料很杂,经验证很多都是错的,例如需要设置eventLimit为true,或者直接给eventLimit设置具体的值,实测都是谬传,很可能是对原生的日历组件配置,而不是针对vue封装后的组件配置。

此外,+2more是没有经过汉化的,这里再补充一个参数moreLinkContent设置,来将其转换为中文。

// 限制事件最大数量
dayMaxEvents: 6,
// 事件数量超出时更多显示链接汉化
moreLinkContent: '+ 更多',

调整后效果如下:
image.png
点击后会自动调用内置的popover,显示完整的事件清单,效果如下:
image.png
注意,以上参数配置仅适用于月视图。

对于周视图和日视图,因为自身区域就很大,正常情况下根本就用不完,因此也不需要设置上限。
image.png


http://www.ppmy.cn/ops/41410.html

相关文章

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

C语言操作符(补充+面试)

移位操作符 左移操作符&#xff08;<<&#xff09; 左移操作符将操作数的所有位向左移动指定的位数。移动过程中&#xff0c;右侧空出的位用0填充。例如&#xff0c;将二进制数1010左移1位&#xff0c;得到的结果是101000。在C语言中&#xff0c;左移操作符通常用于实现…

Redis分布式缓存

分布式缓存 引入&#xff1a; 一&#xff1a;持久化&#xff1a; 1.1.RDB持久化&#xff1a; 1.2.AOF文件&#xff1a; 记得关闭RDB&#xff0c;开启AOF。 注意&#xff0c;AOF默认是详细的记录每一条命令&#xff0c;即使是对同一个key的多次修改&#xff0c;RDB只会记录最…

ssrf漏洞学习——基础知识

一、SSRF是什么&#xff1f; SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能…

【Viso画图】Viso导出与图形适配的pdf

step1:选中开发工具点击shapeSheet&#xff0c;选中页 step2&#xff1a;进入页面参数设置窗口&#xff0c;将下面框选的参数设为0,enter后保存 目前效果&#xff1a; step3:选中设计->大小&#xff0c;选择适应页面大小或者自己根据图片调整 目前效果&#xff1a; step4: 以…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

翻工第二次 Ant Design Pro 下载,发现问题,电脑网络配置有误,魔法了

一、相关网址链接 鱼皮的用户中心项目 &#xff08;前端Ant Design Pro构建&#xff09; 语雀 ## 没有选择umi版本这一步 Issue #11144 ant-design/ant-design-pro GitHub 关于umi ui图标未显示问题_umi ui不出现-CSDN博客 二、存在问题 导致下载速度慢 本人镜像代码写…

vite 和wepack 的差异

Vite 和 Webpack 是两种现代前端开发中常用的构建工具&#xff0c;它们各有特点和适用场景。以下是 Vite 和 Webpack 之间的一些关键差异&#xff1a; 开发速度与热更新 (HMR)&#xff1a; Vite 利用了浏览器对 ES 模块的支持&#xff0c;能够在开发环境下实现几乎即时的模块热…