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

news2024/11/28 13:52:36

背景

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

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

使用

全天与非全天区域拖动引发的结束时间清空问题(二)

实现方案

最终实现逻辑代码如下:

// 拖动结束
eventDrop(arg) {     
  const allDay = arg.event.allDay
  const plannedDuration = arg.event.extendedProps.plannedDuration
  const start = arg.event.start
  let end = arg.event.end
  console.log('before', end)
  if (allDay) {
    // 拖动结束位于全天事件区域
    if (end == null) {
      // 拖动结束时间为空,则设置为开始时间+1天
      end = new Date(start.getTime() + 24 * 60 * 60 * 1000)
    }
  } else {
    // 拖动结束位于非全天事件区域
    if (end == null && plannedDuration != null) {
       // 拖动结束时间为空且计划时长不为空,则设置为开始时间+计划时长
      end = new Date(start.getTime() + plannedDuration * 60 * 60 * 1000)
    }
  }
  console.log('after', end)
  arg.event.setEnd(end)
  this.changeTime(arg)
}

以上增加了判断结束时间是否为空的逻辑,是过滤掉区域内移动的情况。

上面处理过程中需要用到任务的计划时长属性,这不是一个FullCalendar组件的事件对象自身属性,在加载数据环节,需要将该属性放到事件对象的扩展属性extendedProps中。

// 加载数据
loadData() {
  this.$api.personaltask.task.listWithScope(this.startTime, this.endTime).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,
          extendedProps: {
            priority: item.priority,
            plannedDuration: item.plannedDuration
          }
        }
      })
      this.eventData = eventArray
      this.filteData()
    }
  })
}

测试各种场景下的移动,区域内移动、区域间移动、结束时间有值、结束时间无值,均能正常处理。

并且当任务设置了计划时长的时候,从全天区域拖放到具体的开始时间,系统会自动将结束时间设置为开始时长和计划时长的和,更符合用户的期望。

可选方案

在摸索解决的过程中,发现了FullCalendar自带的一个属性allDayMaintainDuration。
其作用是确定一个事件的持续时间全天与非全天两个区域间拖动应该如何变化,该值默认为false,未开启状态。看说明这个参数跟我们期望实现的需求密切相关,于是动手验证了下。

当设置为false时(这是默认值),事件的持续时间将根据它被拖放到的部分进行重置。如果事件被拖放到全天区域,它的持续时间将重置为defaultAllDayEventDuration(可能是一天)。如果事件被拖放到非全天区域,它的持续时间将重置为defaultTimedEventDuration(可能是一个小时)。

官方说明是这样,但所谓的重置,实际只是前端显示看上去时一整体或一小时,当会将事件对象中的结束时间属性清空掉,在进行调用后端服务持久化时导致结束时间丢失。

当设置为true时,事件在被拖放到全天区域或从全天区域拖出后,其持续时间将大致保持不变。这里所说的“大致”是因为如果一个事件的持续时间具有小时级的精度,它将被向下舍入到最近的整天。这意味着,如果一个事件原本跨越了数个小时但不是一整天,当它被拖放到全天区域时,它的持续时间将被调整为整个日历日。

测试了下效果,非全天事件拖放到全天区域,结束时间会自动变更为当天结束,不会置空;全天事件拖放到非全天区域,起止时间自动变成0点到24天,结束时间不会置空,但是一下占满当天所有时段,用户体验是比较差的,需要通过缩放操作调整起止时间。
image.png
该方式最大的优点就是简便,不需要进行复杂的二次开发,开启一个参数配置即可;最大的缺点就是用户体验较差,明显不如我们前面进行的二次扩展,结合了任务计划时长进行了自动化处理工作。

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

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

相关文章

LVGL:

LVGL(little video graphics library)是一个开源的嵌入式图形库,提供高性能、低资源占用的图形用户界面(GUI)。具有模块化(项目工程源码)设计,可以在多平台使用(如微处理…

《幻影大师:透视缠中说禅的虚像与真相》

而且他从不犯错,至少在他的叙述中是这样,所有的文章和言论都被粉饰得完美无瑕,即便有误,他也绝不公开承认,更别提什么真诚的道歉和改正了。那些对他推崇备至的人,多是盲目追随,将他神化为无所不…

Vue部分文件说明

1.eslintignore文件 Eslint会忽略的文件 # Eslint 会忽略的文件.DS_Store node_modules dist dist-ssr *.local .npmrc 2.gitignore # Git 会忽略的文件.DS_Store node_modules dist dist-ssr .eslintcache# Local env files *.local# Logs logs *.log npm-debug.log* yarn-de…

echarts写某个市地图

const geoJSON {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"adcode":440303,"name":"罗湖区","center":[114.123885,22.555341],"…

简单易用的多功能图床Picsur

什么是 Picsur ? Picsur 是一款易于使用、可自行托管的图片分享服务,类似于 Imgur,并内置转换功能。支持多种格式的图片,包括 QOI、JPG、PNG、WEBP(支持动画)、TIFF、BMP、GIF(支持动画&#xf…

AI Agent智能应用从0到1定制开发(完结)

在数字化时代的浪潮中,人工智能(AI)代理智能应用如同星辰般璀璨,引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用,就像是在无垠的宇宙中绘制一颗新星的轨迹,每一步都充满了挑战与创新的火花。…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后,实在是太香了,非常符合我这从XAML走过来的老程序员的手感,所以老想着在Blazor项目中引入。看了几个老外大佬的视频,调试了一下午,终于是捣鼓成功了。由于咱们Blazor项目不在node…

[vue3]极速上手

介绍 vue3官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 1.0更容易维护 支持组合式API 可以减少代码量, 并且分散式维护转为集中式维护, 更容易封装复用 友好的TS支持 vue3的源码都被TS重写, 所以对TS的支持更友好 2.0更快的速度 新的diff算法, 模版编译优化, 更高效的…

【FireSim/Chipyard】解决FireSim Repo Setup步骤中Conda的firesim环境下载失败的问题

【FireSim/Chipyard】解决FireSim Repo Setup步骤中Conda的firesim环境下载失败的问题 问题描述 按照U250官方文档下载Conda环境的时候,即语句./scripts/machine-launch-script.sh --prefix REPLACE_ME_USER_CONDA_LOCATION的时候会遇到以下报错: Sol…

Locust web性能测试实践

Locust web性能测试实践 Locust 是一个开源的负载测试工具,使用Python语言实现,其简洁、轻量、高效的并发机制基于Gevent协程,可以实现单机模拟生成较高的并发压力。具有分布式和可扩展的特点,能够帮助你评估系统的性能并找到潜在…

【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;栈和队列相关知识 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模板进阶 &#x1f9e9;<&…

ArrayList集合+综合案例

数组与集合的区别 ArrayList 概述 是java编写好的一个类,用于表示一个容器,使用的时候,需要注意指定容器中元素的数据类型;(如果不指定,语法不报错,但是取值的时候不方便)注意事项 使用的时候,写ArrayList<元素的数据类型>的数据类型的时候,带着泛型;使用ArrayList集合…

一文搞定 大语言模型(LLM)微调方法

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx&#xff0c;你可以按照以下步骤操作&#xff1a; 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目&#xff0c;假设前…

【scikit-learn入门指南】:机器学习从零开始

1. 简介 scikit-learn是一款用于数据挖掘和数据分析的简单高效的工具&#xff0c;基于NumPy、SciPy和Matplotlib构建。它能够进行各种机器学习任务&#xff0c;如分类、回归和聚类。 2. 安装scikit-learn 在开始使用scikit-learn之前&#xff0c;需要确保已经安装了scikit-le…

物联网模型

1.1 流模型源码 到OneNote Makefile出错:build/output/paho_c_version 先make clean移除bulid/output内的动态库,再make就会看到出错,将build/output的动态库文件命名以 . so结束,再次make就不会出错了。在sudo make install 安装在usr/local/lib中 修改main.c文件之后,…

火车头采集织梦发布模块插件下载及教程

火车头采集网页数据发布到织梦CMS&#xff08;DeDeCMS&#xff09;系统操作步骤如下&#xff1a; 1. 火车头采集织梦DeDeCMS发布模块下载安装 百度网盘&#xff1a;火车头采集织梦CMS发布插件下载地址 提取码&#xff1a;414h 2. 在火车头采集软件导入织梦De…

【深度学习】stable-diffusion-3,SD3生图体验

stabilityai/stable-diffusion-3-medium 代码地址&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-3-medium 可在这里体验&#xff1a; https://huggingface.co/spaces/ameerazam08/SD-3-Medium-GPU

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 生成哈夫曼树(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 生成哈夫曼树(100分) 🌍 评测功能需要订阅专栏后私信联系清…

全面解析OpenStack架构:掌握云计算核心组件!

Web Frontends Horizon 技术原理&#xff1a;Horizon是OpenStack的基于Web的用户界面&#xff0c;利用Django框架开发&#xff0c;提供用户友好的界面来管理和使用OpenStack资源。应用场景&#xff1a;用于管理虚拟机、存储、网络等资源。举例&#xff1a;管理员通过Horizon界面…