打造你的专属Vue组件:基于FullCalendar超实用“日程任务管理组件”实战

打造你的专属Vue组件:基于FullCalendar超实用“日程任务管理组件”实战

在现代Web应用中,日程管理是一个常见而又关键的功能,它帮助用户高效安排和追踪日常任务及会议。Vue.js作为一个流行的前端框架,以其简洁的语法和强大的组件化能力深受开发者喜爱。本文将手把手教你如何利用Vue 3和FullCalendar库构建一个功能丰富、易用的日程任务管理组件,让你的应用瞬间提升日程管理体验。

引言

FullCalendar是一款功能全面的日历插件,支持多种视图展示、事件拖放编辑、外部数据源集成等功能,是构建日程管理系统的理想选择。结合Vue 3的Composition API,我们可以轻松实现组件化开发,提高代码的可维护性和复用性。

效果

在这里插入图片描述

准备工作

安装依赖

安装FullCalendar及其必要的Vue 3适配器和视图插件:

npm install @fullcalendar/core @fullcalendar/vue3 @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list

引入样式

public/index.html中加入FullCalendar的CSS:

<head>
  <!-- ... -->
  <link rel="stylesheet" href="@fullcalendar/core/main.css">
  <link rel="stylesheet" href="@fullcalendar/daygrid/main.css">
  <link rel="stylesheet" href="@fullcalendar/timegrid/main.css">
  <link rel="stylesheet" href="@fullcalendar/list/main.css">
  <!-- ... -->
</head>

创建日程任务管理组件

新建组件

src/components目录下创建Calendar.vue

<template>
  <div class="app-container">
    <FullCalendar :options="calendarOptions" />
  </div>
</template>

<script setup>
import { defineComponent } from "vue";
import FullCalendar from "@fullcalendar/vue3";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";
import listPlugin from "@fullcalendar/list";
import interaction from "@fullcalendar/interaction";
import dayjs from 'dayjs'

const matchList = ref([
  {
    id: "1",
    title: "第一个任务",
    start: "2024-05-26 13:22:24",
    allDay: true,
    color: "#FECACA",
    textColor: "#6B7280",
  },
  {
    id: "11",
    title: "第二个任务",
    start: "2024-05-26 13:22:24",
    end: "2024-05-28 23:22:24",
    allDay: true,
    color: "#6EE7B7",
  },
  {
    id: "12",
    title: "第三个任务",
    start: "2024-05-26 13:22:24",
    allDay: true,
    color: "#93C5FD",
  },
  {
    id: "13",
    title: "劳动节",
    start: "2024-05-01 00:00:00",
    allDay: true,
    color: "#F59E0B",
    editable: false,
  },
  {
    id: "2",
    title: "第二个任务",
    start: "2024-05-27 13:22:24",
    end: "2024-06-27 23:22:24",
    allDay: true,
    color: "#FBCFE8",
  },
  {
    id: "4",
    title: "第三个任务",
    start: "2024-05-28 13:22:24",
    end: "2024-046-28 23:22:24",
    allDay: true,
    color: "#EDE9FE",
  },
]);

const handleDateSelect = (e) => {
  // console.log(e, "handleDateSelect");
};

const handleEventClick = (e) => {
  // console.log(e, "handleEventClick");

};

const handleEvents = (e) => {
  // console.log(e, "handleEvents");
};
const eventDrop = (
  event,
  dayDelta,
  minuteDelta,
  allDay,
  revertFunc,
  jsEvent,
  ui,
  view
) => {

};
// 开始拖拽
const startDrag = (event,jsEvent,ui)=>{
  console.log(event,'ssss');
  let obj = event.event
  let id = obj.id
  let start = obj.startStr
  let end = obj.endStr
  console.log([start,end],'开始拖拽时间点');
}
// 拖拽结束
const stopDrag = (event,jsEvent,ui)=>{
   console.log(event,'endedb');
  let obj = event.event
  let start = obj.startStr
  let end = obj.endStr
  console.log([start,end],'结束拖拽时间点');
}
// 定义日历配置
const calendarOptions = {
  plugins: [dayGridPlugin, timeGridPlugin, listPlugin, interaction],
  locale: "zh-cn",
  firstDay: "1",
  initialView: "dayGridMonth", // 初始视图
  weekends: true, // 显示周末
  height: 800, //日历高度
  eventColor: "#3BB2E3", // 全部日历日程背景色
  themeSystem: "bootstrap", // 主题色(本地测试未能生效)
  timeGridEventMinHeight: "20", // 设置事件的最小高度
  aspectRatio: 1.65, // 设置日历单元格宽度与高度的比例。
  headerToolbar: {
    left: "prev,next today",
    center: "title",
    right: "dayGridMonth,timeGridWeek,timeGridDay,listWeek",
  },
  // buttonText: {
  //     today: '今天',
  //     month: '月',
  //     week: '周',
  //     day: '日'
  //   },
  slotLabelFormat: {
    hour: "2-digit",
    minute: "2-digit",
    meridiem: false,
    hour12: false, // 设置时间为24小时
  },
  handleWindowResize: true,
  droppable: true, //可拖拽的
  editable: true,
  selectable: true,
  selectMirror: true,
  dayMaxEvents: true,
  weekends: true,
  selectable: true, // 是否可以选中日历格
  selectMirror: true,
  selectMinDistance: 0, // 选中日历格的最小距离
  dayMaxEvents: true,
  weekends: true,
  navLinks: true, // 天链接
  selectHelper: false,
  slotEventOverlap: false, // 相同时间段的多个日程视觉上是否允许重叠,默认true允许
  select: handleDateSelect,
  eventClick: handleEventClick,
  eventsSet: handleEvents,
  eventDragStart:startDrag,
  eventDragStop:stopDrag,
  events: matchList.value,
};
</script>

数据交互

在真实场景中,事件数据通常来自API。你可以使用axios或fetch等库获取数据,并填充到calendarOptions.events中。这里简单模拟数据加载过程:

// 在onMounted内添加
const fetchData = async () => {
  try {
    const response = await fetch('/api/events'); // 假设的API路径
    const eventsData = await response.json();
    calendarRef.value.getApi().addEventSource(eventsData);
  } catch (error) {
    console.error('Error fetching events:', error);
  }
};
fetchData();

添加、编辑、删除事件

FullCalendar提供了丰富的API来处理事件的交互,如select用于添加新事件,eventDropeventResize用于编辑事件,eventRemove用于删除事件。你可以通过监听这些事件并在回调中实现相应的逻辑。

结语

至此,一个基本的日程任务管理组件已经构建完成,你可以根据项目需求进一步定制,如添加权限控制、时间区间选择限制、事件颜色分类等高级功能。Vue 3与FullCalendar的结合,不仅让日程管理变得简单直观,也极大地提升了用户体验。希望这篇实战教程能帮助你在未来的项目中快速实现高效、美观的日程管理功能。

官网文档地址

官网文档地址

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

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

相关文章

鸿蒙开发接口资源管理:【@ohos.i18n (国际化-I18n)】

国际化-I18n 说明&#xff1a;开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。I18N模块…

寄存器、缓存、内存(虚拟、物理地址)、DDR、RAM的关系

寄存器、缓存、内存、DDR、RAM的关系 1. 主要概念内部存储器&#xff1a;2.1 寄存器&#xff0c;register2.2 主存储器&#xff0c;内存&#xff0c;memory2.3 缓存&#xff0c;高速缓冲存储器&#xff0c;cache 外部存储器2.4 快闪存储器&#xff0c;闪存&#xff0c;flash Me…

快手游戏《无尽梦回》官宣开测:热血动作肉鸽来袭

易采游戏网最新消息&#xff1a;5月30日11:00&#xff0c;快手自研的梦境主题动作冒险手游《无尽梦回》正式宣布开启测试。此次测试名为“肉鸽进化实验”&#xff0c;旨在测试多角色技能交会的玩法。游戏将开放32人同局竞技&#xff0c;让玩家在激烈的战斗中角逐出唯一的胜利者…

Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)

前言 本来是想着写多表关系的&#xff0c;不过写了一半发现重复的部分太多了&#xff0c;想了想与其做一些重复性工作&#xff0c;不如把一些当时觉得抽象的东西记录一下&#xff0c;就当用一篇杂记完成专栏的最后一篇文章吧。 预加载 简单示例 预加载主要用于在多表关系中…

【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

数据标准的制定落地

目录 什么是数据标准 基本定义 目的 数据标准体系分类 从内容层面分类 从管理视角分类 从面向的对象分类 从数据结构的角度分类 数据标准价值 业务价值 技术价值 管理价值 数据标准和数据治理的关系 数据标准在数据治理各项任务中的作用 数据标准与主数据 数据…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、重要的几个热键[Tab]&#xff0c;[ctrl]-c&#xff0c;[ctrl]-d 一、时间相关的指令date date 指定格式显示时间&…

夜天之书 #98 Rust 程序库生态合作的例子

近期主要时间都在适应产品市场&#xff08;Product Marketing&#xff09;的新角色&#xff0c;不少想法还在酝酿和斟酌当中&#xff0c;于是文章输出没有太多时间来推敲和选题&#xff0c;只能保持每月发布相关的进展或一些零碎的思考。或许我可以恢复最早的模式&#xff0c;多…

node.js点餐系统app-计算机毕业设计源码84406

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

脚本实现登陆滑块

脚本实现登陆滑块 仅供学习参考&#xff0c;简单操作 你知道吗&#xff0c;滑动验证码居然是为了验证人类比机器人蠢而设计的。 你以为自己快速、准确地滑动拼图、对齐图案&#xff0c;才被允许通过&#xff0c;系统还说你超越了99%的用户&#xff0c;夸你“比闪电还快”&am…

算法-随机快排及荷兰国旗优化

文章目录 算法介绍 :1. 随机快排解析2. 荷兰国旗问题3. 随机快排优化4. 总结随机快排 算法介绍 : 随机快速排序和传统的快速排序的逻辑本质是一致的,都是找到一个值作为划分的中间位置,左边数值均小于该数值,右边数值均大于该数值,但是与传统的快排又不一致的是,我们的这个位置…

Chrome DevTools

Console 面板 此章节请打开 justwe7.github.io/devtools/console/console.html 一起食用 一方面用来记录页面在执行过程中的信息&#xff08;一般通过各种 console 语句来实现&#xff09;&#xff0c;另一方面用来当做 shell 窗口来执行脚本以及与页面文档、DevTools 等进行交…

动态SQL IF语句

IF语句学习 第一种写法(标准) 我们先来看以下标准写法: select * from .. <where> <if test""> and ....... <if test""> and ....... <where> 我们用了一个where标签 , 内嵌if语句 第二种写法: 这是第二种写法:不用where标…

综合交易模型--雪球跟单参数说明支持qmt,同花顺

经过测试&#xff0c;目前完成了这个策略。支持多策略&#xff0c;支持全市场&#xff0c;包括股票&#xff0c;etf,可转债 全部的参数 { "雪球跟单":"跟单原理", "原理":"比重变大默认买入&#xff0c;变小默认卖出&#xff0c;持股…

【SpringBoot】SpringBoot项目关于默认port以及context path的配置 application.yml

application.yml server port [端口号] 配置/修改默认端口号 # server configurationserver:port: 8080context path [虚拟目录] 配置/修改默认虚拟目录 # server configurationserver:servlet:context-path: /spring configuration # spring configuration spring:applica…

mysql DDL——增删改

简略版&#xff1a; 详细版&#xff1a; DDL&#xff1a;对库中表的的记录进行增删改操作&#xff1b; 分别对应&#xff1a;添加&#xff08;insert&#xff09;&#xff0c;修改(update)&#xff0c;删除(delete); 一&#xff1a;添加数据 1. 对全部字段添加数据&#x…

【一刷《剑指Offer》】面试题 28:字符串的排列

牛客对应题目链接&#xff1a;字符串的排列_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 157. 套餐内商品的排列顺序 - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a;全排列问题&#xff0c; DFS。 一、《剑指Offer》对应内容 二、分析题…

关于留痕的使用常见的问题

1. 登录微信 登录要导出数据的微信&#xff08;不支持微信多开&#xff0c;不支持部分老版本微信&#xff09; 相关信息 想把手机端的微信聊天记录转移到电脑上可以使用微信自带的聊天记录迁移功能 操作步骤&#xff1a; 安卓&#xff1a; 手机微信->我->设置->聊…

AI解密:语言模型生成下一个词的概率从何而来

在这个信息爆炸的时代&#xff0c;你是否曾好奇过&#xff0c;当你与聊天机器人流畅对话时&#xff0c;那些机智回复的背后&#xff0c;究竟隐藏着怎样的秘密&#xff1f;今天&#xff0c;就让我们一起乘坐时光机&#xff0c;深入语言模型的神秘腹地&#xff0c;揭开它预测下一…

【spring】第二篇 bean实例化

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的 实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…