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

背景

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

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

使用

调整单元格高度

默认情况下,单元格高度会自动扩展,如下图所示,留下不小的空白,既浪费空间又不美观。
image.png
解决方式就是为高度height属性指定值auto,如下:

// 高度自动调整
height: 'auto'

效果如下:
image.png

月视图中显示事件时间开关

默认情况下,会在事件标题前方显示该事件的开始时间
image.png
如不想要,可以用下面这种方式来取消显示。

 // 视图的一些基本设置
views: {  
  dayGridMonth: {
    //是否显示时间
    displayEventTime: false
  },
  timeGridWeek: {},
  timeGridDay: {},
  listMonth: {}
},

个人认为显示时间还是不错的功能,所以暂时保留,该配置放这里做个备忘。

设置全天属性优化显示

有些任务,我们需要安排一整天,或者好几天,亦或者不想具体安排某天的哪个时间点来做。
这时候起止时间就设置到天,没有到小时的粒度,默认情况下如下显示,占满整天,影响其他任务的展示和查看的直观性。
image.png
这种情况,我们可以使用allDay属性来做优化, 若起止时间均为00:00:00,则设置为allDay属性为true,这样任务就会显示在顶部“全天”区域。
代码如下:

 // 加载数据
    loadData() {
      this.$api.personaltask.task.listWithChildren().then((res) => {
        if (res.data) {
          const eventArray = res.data.map((item) => {
            // 若起止时间均为00:00:00,则设置为allDay属性为true
            let allDay = false
            if (
              item.startTime &&
              item.endTime &&
              item.startTime.substr(11, 8) === '00:00:00' &&
              item.endTime.substr(11, 8) === '00:00:00'
            ) {
              allDay = true
            }
            return {
              id: item.id,
              title: item.name,
              start: item.startTime,
              end: item.endTime,
              allDay: allDay
            }
          })
          this.calendarOptions.events = eventArray
        }
      })
    },

调整后效果如下:
image.png

切换显示全部与未完成

任务的状态有多个,待安排、未开始、进行中、已完成、已超期、已取消、已挂起,对于已完成、已取消这两类,通常会视为已结束,并不需要过多关注,如一直显示在列表中,则会一定程度上影响未结束的任务展现。
我们在头部工具栏添加一个自定义按钮,来控制是否只显示未结束的任务。
添加自定义按钮:

customButtons: {
  changeShowScopeButton: {
      text: '显示全部',
      click: this.changeShowScope
    }
}

在头部工具栏配置自定义按钮

  // 头部显示
  headerToolbar: {
    left: 'today',
    center: 'prevYear,pre title next,nextYear',
    right: 'changeShowScopeButton dayGridMonth,timeGridWeek,timeGridDay,listWeek'
  }

定义变量和方法

   // 显示所有事件
  showAllFlag: false,
  // 事件数据
  eventData: []



  // 变更显示范围
  changeShowScope() {
    this.showAllFlag = !this.showAllFlag
    this.filteData()
  },
  // 筛选数据
  filteData() {
    if (this.showAllFlag) {
      this.calendarOptions.customButtons.changeShowScopeButton.text = '显示未结束'
      this.calendarOptions.events = this.eventData
    } else {
      this.calendarOptions.customButtons.changeShowScopeButton.text = '显示全部'
      this.calendarOptions.events = this.eventData.filter((item) => {
        return (
          item.status === 'IN_PROGRESS' ||
          item.status === 'TO_DO' ||
          item.status === 'EXPIRED' ||
          item.status === 'PENDING' ||
          item.status === 'PAUSED'
        )
      })
    }
  },
  // 加载数据
  loadData() {
    this.$api.personaltask.task.listWithChildren().then((res) => {
      if (res.data) {
        const eventArray = res.data.map((item) => {
          // 若起止时间均为00:00:00,则设置为allDay属性为true
          let allDay = false
          if (
            item.startTime &&
            item.endTime &&
            item.startTime.substr(11, 8) === '00:00:00' &&
            item.endTime.substr(11, 8) === '00:00:00'
          ) {
            allDay = true
          }
          return {
            id: item.id,
            title: item.name,
            start: item.startTime,
            end: item.endTime,
            allDay: allDay,
            status: item.status
          }
        })
        this.eventData = eventArray
        this.filteData()
      }
    })
  }     

默认仅显示未结束的任务,点击按钮可切换至显示全部任务
image.png

去除上一年与下一年按钮

从当前需求出发,任务查看都是当前附近,并不需要上一年与下一年这个大跨度,因此配置头部工具栏,去除上一年与下一年这两个按钮的显示,保留上一个与下一个两个按钮。

// 头部显示
headerToolbar: {
  left: 'today',
  center: 'prev title next',
  right: 'changeShowScopeButton dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},

image.png

开启视图间导航功能

我们在查看月视图时,如果对某一周或某一天的具体日程感兴趣,想进入查看,可以打开官方预置的一个开关,这样周次和日都会启用链接导航功能,点击可进入周视图和日视图。

// 开启视图间导航功能
navLinks: true,

image.png
image.png
同理,周视图、日视图和列表视图,都会开启超链接,进行视图间的切换。
image.png
image.png
image.png

官方提供了预置操作,如果想改变默认的行为,跳转到自定义视图,则可以设置navLinkDayClick和navLinkWeekClick这两个事件。
官网文档:https://fullcalendar.io/docs/date-nav-links。

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

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

相关文章

摆脱手工录入烦恼,OCR技术大幅提高增值税发票处理效率

最近,我邂逅了一位得力助手——OCR技术,它犹如一位神通广大的魔法师,为增值税发票处理带来了翻天覆地的变革! 曾几何时,处理增值税发票如同走进了一片迷雾重重的森林,每一步都小心翼翼,生怕出错…

AI绘画进阶工具ComfyUI 傻瓜整合包安装教程!模型共享,一键安装!

哈喽大家好,今天给大家分享一下AI绘画工具Stable Diffusion的另一种UI界面,常见的有: 窗口式界面的WebUI 节点式工作流的ComfyUI ComfyUI更加进阶一些,是一个节点式工作流的AI绘画界面,它高度可定制、自定义编辑Ai生…

数据结构_链表基本操作的实现_代码_例题

一、基本操作实现 1.按位序插入(带头节点) 2.按位序插入(不带头节点) 3.指定结点的后插操作 4.指定结点的前插操作 5.按位序删除(带头节点) 6.指定结点的删除 7.按位查找,返回第i个元素&…

Axure RP移动端交互元件库/交互原型模板

作品类型:元件库/原型模板 更新日期:2023-12-04 当前版本:V1.3 适用范围:App应用/小程序 Axure版本:Axure 9.0均可打开 文件大小:36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…

Spring注解驱动开发

1、Spring注解驱动开发图解

英语单词量测试

网址:https://preply.com/en/learn/english/test-your-vocab 测试结果: 细节:英语母语者有20000-35000个单词的词汇量,8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的,6000个单词足够用了。足够用&#xff0…

MSR810-LM快速配置通过LTE模块上网

正文共:1111 字 13 图,预估阅读时间:1 分钟 之前买了一个无线版本的MSR810-W(淘了一台二手的H3C企业路由器,就用它来打开网络世界的大门),并整理了一份快速配置(脚本案例来了&#x…

在pycharm添加pyqt5外部工具插件

一:查看环境所在位置以及安装pyqt5库 1、打开anaconda,输入以下命令,查看环境名,以及环境所在位置。 conda info --envs 从图中得知以下信息,下面根据自己实际情况,记住环境名和路径 ①环境名是&#xf…

redis报错500

之前自己举一反三把value也给序列化了: 然后报错了: 原因是这里传入的是Integer类型,序列化的话就变为string类型了

【Linux】-IP地址、主机名配置[5]

目录 一、IP和主机名 1、IP地址 2、特殊IP地址 3、主机名 4、在Linux中修改主机名 5、配置主机名映射 二、虚拟机配置固定IP 1、为什么需要固定IP 2、在VMware Workstation中配置固定ip 一、IP和主机名 1、IP地址 每一台联网的电脑都会有一个地址,用于和…

ALV 红绿灯

前言 在ABAP ALV中,LIGHTS_FIELDNAME参数是用于实现行级视觉指示或“灯光效果”的一个重要设置项,尤其适用于标记或突出显示列表中符合特定条件的行。这个参数通常是在定义ALV布局(使用结构如LVC_S_LAYOUT或通过SALV类的相应方法)…

IDEA 每次启动都显示选择项目页面

IDEA版本:2021.3.3 打开 Settings > Appearance & Behavior > System Settings 取消勾选 Reopen projects on startup 然后下次启动 IDEA 会显示选择项目页面

Flutter 3.22 发布,快来看看有什么更新吧?

Flutter 3.22 发布,快来看看有什么更新吧? 本次 Flutter 跟随 Google I/O 发布的版本是 3.22 ,该版本主要还是带来了 Vulkan backend 和 Wasm Native 的落地,另外还有一个重点就是 Dart macros ,但是它更多只是一个预…

2025年第十一届北京国际印刷技术展览会

2025年第十一届北京国际印刷技术展览会 展览时间:2025年5月15-19日 展览地点:北京中国国际展览中心(顺义馆) 主办单位:中国印刷及设备器材工业协会中国国际展览中心集团有限公司 承办单位:北京中印协华港国…

2023年国赛高教杯数学建模B题多波束测线问题解题全过程文档及程序

2023年国赛高教杯数学建模 B题 多波束测线问题 原题再现 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀速直线传播,在不同界面上产生反射,利用这一原理,从测量船换能器垂直向海底发射声波信号&#xff…

ITIL4之IT服务战略

战略和IT战略 战略 的概念最早源于军事领域,意在通过对战争全局的精心规划和指挥,利用有限资源高效达成政治和军事目标。这一思想逐渐扩展到商业、管理乃至信息技术领域,成为指导长远发展和资源配置的核心框架。 IT战略 是将军事战略的智慧…

内网安全-隧道搭建穿透上线FRPNPSSPPNgrokEW项目

旨在代理连接肉鸡后实现本地渗透肉鸡网络架构 Linux:Proxychains Windows:Sockscap Proxifier 穿透项目:Ngrok Frp Spp Nps EW(停更) 优点:穿透加密数据,中间平台,防追踪,解决网络问题 https://…

第二步 完善MBR

文章目录 前言一、什么是MBR?二、我们需要什么样的MBR?三、设计我们的MBR!1、打印“1 MBR”2、加载次引导程序——loader 四、实践检验! 查看系列文章点这里: 操作系统真象还原 前言 在上一篇文章 第一步 从启动BIOS开…

保障数据安全:数据防泄漏加密软件功能对比

在数字时代,数据安全成为企业必须重视的关键问题。随着信息技术的飞速发展,数据的传输、存储和处理变得愈发便捷,但这也为数据泄露带来了更大的风险。为了应对这一挑战,数据防泄漏加密软件应运而生,成为保障数据安全的…

解决 : ERROR: Rosdep experienced an error: The read operation timed out

问题描述 安装过程中的 rosdep update 报错超时问题,需要访问github进行更新,由于国内网络受限,不能正常访问github,从而导致 rosdep update超时。 解决方法 修改rosdep的python源文件,通过代理地址 https://ghprox…