了解Vue中日历插件Fullcalendar

2024-01-19 14:12

本文主要是介绍了解Vue中日历插件Fullcalendar,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现效果如下图:

月视图
在这里插入图片描述

在这里插入图片描述
周视图
在这里插入图片描述
日视图
在这里插入图片描述

官方文档地址:Vue Component - Docs | FullCalendar

1、安装与FullCalendar相关的依赖项

npm install --save @fullcalendar/vue @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/list
npm install --save @fullcalendar/interaction
npm install --save @fullcalendar/core @fullcalendar/resource-timeline

2.使用日历的页面需要导入

import FullCalendar from "@fullcalendar/vue";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";
import listPlugin from "@fullcalendar/list";
import interactionPlugin from "@fullcalendar/interaction";
// import resourceTimelinePlugin from "@fullcalendar/resource-timeline";

完整代码

<template><div><div class="fc-toolbar"><div class="fc-left"><el-button-group><el-button @click="month"></el-button><el-button @click="week"></el-button><el-button @click="today"> 今天 </el-button></el-button-group></div><div class="fc-center"><el-button icon="el-icon-arrow-left" @click="prev"/><p class="title">{{ title }}</p><el-button icon="el-icon-arrow-right" @click="next" /></div><div><el-select v-model="type" style="margin-right: 20px" @change="handleType"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /></el-select><el-button class="search" style="margin-right: 20px" type="button" @click="addEvent">新增</el-button><el-button class="search" type="button" @click="search">查询</el-button></div></div><el-dialog title="添加日程" :visible.sync="dialogFormVisible" width="600px"><el-form :model="form"><el-form-item label="事件"><el-input v-model="form.content" autocomplete="off" placeholder="请输入事件"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogFormVisible = false">取 消</el-button><el-button type="primary" @click="navConfirm">确 定</el-button></div></el-dialog><div v-if="showFullcalendar">加载数据中......</div><FullCalendar v-else id="calendar" ref="fullCalendar" class="demo-app-calendar" :options="calendarOptions"><template v-slot:eventContent="arg"><el-popover placement="top-start" title="标题" width="200" :visible-arrow="false" trigger="click"><i class="title">{{ arg.event.title }}</i><el-button @click="more(arg.event)"> 更多 </el-button><div slot="reference" class="popper-content"><span>{{ arg.timeText }}</span><i>{{ arg.event.title }}</i></div></el-popover></template><template v-slot:dayCellContent="arg">{{ arg.dayNumberText }}</template><template v-slot:resourceLabelContent="arg">{{ arg.resource.id }}</template></FullCalendar></div>
</template>
<script>import FullCalendar from "@fullcalendar/vue";import dayGridPlugin from "@fullcalendar/daygrid";import timeGridPlugin from "@fullcalendar/timegrid";import listPlugin from "@fullcalendar/list";import interactionPlugin from "@fullcalendar/interaction";// import resourceTimelinePlugin from "@fullcalendar/resource-timeline";let clickCount = 0;let prev = ""; // 上一次点击的dom节点export default {components: {FullCalendar, // make the <FullCalendar> tag available},data() {return {showFullcalendar: true,title: "",currentView: {},options: [{ value: "timeline", label: "resource-timeline" },{ value: "dategrid", label: "agenda" },],type: "dategrid",calendarOptions: {locale: "zh",timeZone: "UTC",plugins: [dayGridPlugin,timeGridPlugin,listPlugin,// resourceTimelinePlugin,interactionPlugin,],buttonText: {// 设置按钮today: "今天",month: "月",week: "周",dayGrid: "天",},initialView: "dayGridMonth", // 设置默认显示月,可选周、日resourceAreaWidth: 200,contentHeight: 600,slotMinWidth: 70,resourceOrder: "number",editable: true,dayMaxEvents: true, // allow "more" link when too many eventseventDurationEditable: true, // 可以调整事件的时间selectable: true, // 日历格子可选择nowIndicator: true, // 现在的时间线显示eventDisplay: "block", // 争对全天的情况下,以块状显示headerToolbar: false, // 隐藏头部的导航栏selectMirror: false,displayEventEnd: true, // like 08:00 - 13:00eventTimeFormat: {// like '14:30:00'hour: "2-digit",minute: "2-digit",meridiem: false,hour12: false, // 设置时间为24小时},events: [],eventColor: "#378006",allDayText: "全天",dateClick: this.handleDateClick, //点击日程事件eventClick: this.handleEventClick,  //点击日历中的某一日程select:this.handleDateSelect, // 监听用户选择的时间段,eventDrop:this.handleEventDrop,  //监听事件被拖动的操作eventResize:this.handleEventResize, //监听事件调整大小的操作resourceAreaHeaderContent: "Rooms",resources: [{id: "111",title: "asas",number: 1,},],schedulerLicenseKey: "GPL-My-Project-Is-Open-Source",resourceLabelContent(arg) {return {html: `<div>id: ${arg.resource.id}</div><div>title: ${arg.resource.title}</div>`,};},views: {customTimeLineWeek: {type: "resourceTimeline",duration: { weeks: 1 },slotDuration: { days: 1 },buttonText: "Custom Week",slotLabelFormat: {weekday: "long",// month: 'numeric',// day: 'numeric',omitCommas: true,},},customTimeLineMonth: {type: "resourceTimeline",duration: { month: 1 },slotLabelFormat: {// month: 'numeric',day: "numeric",// omitCommas: true,},},customGridWeek: {type: "timeGridWeek",dayHeaderFormat: {weekday: "long",},slotLabelFormat: {// 左侧时间格式hour: "2-digit",minute: "2-digit",meridiem: "lowercase",hour12: false, // false设置时间为24小时},},},// 切换视图调用的方法datesSet() { },},calendarApi: null,monthEvent: [{id: "1",resourceId: "1",title: "待办",start: "2024-01-04 09:00",end: "2024-01-04 18:00",color: "red",},{resourceId: "2",id: "2",title: "待办",start: "2024-01-15",color: "purple",},{ title: "待办", start: "2024-01-09" },{ title: "待办", start: "2024-01-17" },{ title: "待办", start: "2024-01-07" },{ title: "待办", start: "2024-01-07", color: "pink" },{ title: "待办", start: "2024-01-07" },{ title: "待办", start: "2024-01-07" },{id: "3",resourceId: "number_3",title: "待办",start: "20240111",end: "20240113",color: "blue",extendedProps: {description: "测试测试测试测试",},},{id: 4,title: "待办",start: "2024-01-15",extendedProps: {description: "test test test test test",},},],weekEvent: [{id: "4",resourceId: "4",title: "周待办",start: "2024-01-11",color: "red",},{id: "5",resourceId: "5",title: "待办1",start: "2024-01-04 10:00",end: "2024-01-04 18:00",color: "orange",},],dayDate:'',dialogFormVisible:false,form:{content:'',},selectInfo:{},};},mounted() {setTimeout(() => {this.showFullcalendar = false;this.$nextTick(() => {this.calendarApi = this.$refs.fullCalendar.getApi();this.title = this.calendarApi.view.title;this.getDtata();});}, 1000);},watch: {// 切换视图显示不同的事件"calendarApi.view.type"(newVal) {this.getDtata();},},methods: {// 监听用户选择的时间段,当用户选择了一段时间后会触发该回调,可以在这里处理创建新的日程。handleDateSelect(selectInfo) {console.log('selectInfo: ', selectInfo);this.selectInfo = selectInfo;this.form.content = '';// 用户选择了一个日期范围时触发this.dialogFormVisible = true;},// 用户拖动移动事件时触发handleEventDrop(dropInfo) {console.log('dropInfo: ', dropInfo);const updatedEvent = { ...dropInfo.event };updatedEvent.start = dropInfo.revertDuration ? dropInfo.oldEvent.start : dropInfo.event.start;updatedEvent.end = dropInfo.event.end;// 更新服务器上的事件或者重新排序你的事件数组// 示例:this.updateEventOnServer(updatedEvent);// 如果是在内存中维护事件,则更新本地数据const index = this.events.findIndex(e => e.id === updatedEvent.id);if (index !== -1) {this.events.splice(index, 1, updatedEvent);}},// 用户调整事件长度时触发handleEventResize(resizeInfo) {console.log('resizeInfo: ', resizeInfo);const updatedEvent = { ...resizeInfo.event };updatedEvent.end = resizeInfo.event.end;// 同样更新服务器或本地数据// 示例:this.updateEventOnServer(updatedEvent);const index = this.events.findIndex(e => e.id === updatedEvent.id);if (index !== -1) {this.events.splice(index, 1, updatedEvent);}},getDtata() {setTimeout(() => {this.calendarOptions.events =this.calendarApi.view.type === "dayGridMonth"? this.monthEvent: this.weekEvent;}, 200);},// 点击更多more(e) { console.log('more ', e)},//确认弹框按钮navConfirm(){this.dialogFormVisible = false;if (this.form.content) {this.calendarOptions.events.push({title: this.form.content,start: this.selectInfo.startStr,end: this.selectInfo.endStr,});// 更新日历视图以显示新添加的事件this.$refs.fullCalendar.getApi().addEvent({  //等同于 this.calendarApi.addEventtitle: this.form.content,start: this.selectInfo.startStr,end: this.selectInfo.endStr,});}},// 增加事件addEvent() {this.form.content = '';this.dialogFormVisible = true;// this.monthEvent},//点击日历中的某一日程handleEventClick(clickInfo) {console.log('clickInfo:', clickInfo);// 用户点击事件时触发,用于编辑或删除事件const event = clickInfo.event;console.log('Clicked on:', event.title);// 这里可以弹出模态框进行编辑或调用删除函数等操作},// 单击事件(日历中的某一天)handleDateClick(e) {this.dayDate = e.dateStr;if (e.dateStr !== prev) {clickCount = 0;}clickCount += 1;prev = e.dateStr;setTimeout(() => {if (clickCount === 2) {console.log("db click");} else if (clickCount === 1) {console.log("one click");}clickCount = 0;}, 300);},// 切换prev() {this.calendarApi.prev();this.title = this.calendarApi.view.title;},next() {this.calendarApi.next();this.title = this.calendarApi.view.title;},// 今天today(date, jsEvent, view) {// if (this.type === "timeline") {//   this.calendarApi.changeView("customTimeLineWeek");// } else {//   this.calendarApi.changeView("customGridWeek");// }this.calendarApi.today();this.title = this.calendarApi.view.title;this.calendarApi.changeView("timeGridDay");// this.calendarApi.today();// this.title = this.calendarApi.view.title;},// 月month() {if (this.type === "timeline") {this.calendarApi.changeView("customTimeLineMonth");} else {this.calendarApi.changeView("dayGridMonth");}this.calendarApi.today();this.title = this.calendarApi.view.title;},// 周week() {if (this.type === "timeline") {this.calendarApi.changeView("customTimeLineWeek");} else {this.calendarApi.changeView("customGridWeek");}this.calendarApi.today();this.title = this.calendarApi.view.title;},// 天day() {this.calendarApi.today();this.title = this.calendarApi.view.title;},// 查询search() {this.calendarApi.changeView("dayGrid", {start: "2022-07-07",end: "2022-07-09",});},// 选择时间线、日程handleType() {if (this.type === "timeline") {this.calendarApi.changeView("customTimeLineMonth");this.calendarOptions.slotLabelFormat = null;} else {this.calendarApi.changeView("dayGridMonth");}},},};
</script>
<style scoped>.demo-app {display: flex;min-height: 100%;font-family: Arial, Helvetica Neue, Helvetica, sans-serif;font-size: 14px;}.demo-app-sidebar {width: 300px;line-height: 1.5;background: #eaf9ff;border-right: 1px solid #d3e2e8;}.demo-app-sidebar-section {padding: 2em;}.demo-app-main {flex-grow: 1;padding: 3em;}.fc {/* the calendar root */max-width: 1100px;margin: 0 auto;}.fc-toolbar {width: 100%;margin: 30px auto;display: flex;flex: 1;justify-content: space-around;align-content: center;}.fc-center {/* height: 40px; */display: flex;align-content: center;}.fc-center .title {font-size: 16px;padding: 0 15px;font-weight: 700;/* height: 40px; *//* line-height: 40px; */}
</style>

这篇关于了解Vue中日历插件Fullcalendar的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622677

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密