Fullcalendar在Vue中的一些使用心得
Fullcalendar在Vue中的一些使用心得
1.序言
这篇文章不包含Fullcalendar向Vue中集成的过程,因为此类教程在网上一搜就是一大把,如果你是为了继承,那请忽略此文章。
这里主要介绍Fullcalendar一些常用的配置项,把我在实际工作中遇到的一些需求,和解决方案分享给大家,也许可以帮到你。
2.自定义View
Fullcalendar默认有三个常用View类型,分别是dayGridMonth(月),timeGridWeek(周),timeGridDay(天)。
此时有个需求为,需要增加一个View,为工作周View,也就是没有周六周日,只有周一到周五,此时用到了Fullcalendar的自定义视图,相关配置如下:
options:
{
plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin],
headerToolbar: {
left: 'prev title next today',
center: '',
right: 'dayGridMonth timeGridWorkWeek timeGridWeek timeGridDay'
},
//默认视图(周) 也可以定义为别的视图名
initialView: 'timeGridWeek',
views: {
//自定义视图的类型
timeGridWorkWeek: {
//在周视图的基础上,来修改为工作周视图,因此type取值'timeGridWeek'
type: 'timeGridWeek',
//此配置项设为false则不显示周六周日,为true则显示,默认为true,因此这里设置为false
weekends: false,
//当使用headerToolbar的时候,button中显示的文字
buttonText: 'work week'
}
}
}
3.绑定View切换事件
如果没有特殊需求,只需要用headerToolbar中的按钮就可以实现View的切换。但是我这边有个需求是不能使用headerToolbar中的按钮,而是自定义一个下拉框,通过选择不同视图来切换视图。这就需要通过代码来切换View了。
其实也很简单,只需要调用changeView方法即可,代码如下:
viewChange(val) {
//vue需要通过此方法来获取fullCalendar的API实例
const calendarApi = this.$refs.fullCalendar.getApi()
//val值为传入view类型 val='dayGridMonth' 则切换为月视图;
//val='timeGridWorkWeek' 则切换为工作周视图
calendarApi.changeView(val)
}
4.自定义Button
自定义按钮非常简单,配置如下:
options:
{
customButtons: {
refreshButton: {
text: '按钮显示的名称',
click: function() {
//点击按钮触发的功能 根据实际需求编写
}
}
},
}
5.Event的样式修改
当你需要修改FullCalendar的Event样式时,只需要修改两个参数即可。
options:
{
events: [
{
//日程标题
title: '提上日程',
//日程开始时间
start: '2022-7-12 10:00:00',
//日程结束时间
end: '2022-7-12 11:00:00',
//Event类名 可以在Style中定义样式 这里直接进入即可
className: 'evnet-class'
//Event的背景颜色
color: '#F9FBFF'
}
],
}
6.设置工作时间
设置工作时间就可以区分工作时间和非工作时间,两者的样式会不同。配置如下:
options:
{
businessHours: {
//周一至周五为工作日
daysOfWeek: [1, 2, 3, 4, 5],
//工作时间每天8点开始
startTime: '8:00',
//工作时间每天17点结束
endTime: '17:00'
},
}
7.自定义日历表头内容和样式
这个需求也相对简单,只需要在dayHeaderContent函数中进行配置,就可以将表头随心所欲的修改了。
options:
{
dayHeaderContent(item) {
//这里可以写自己所以用的到的逻辑代码,item中的参数还是挺丰富的。
//我只接触了item.isToday表示是否为今天,可以用于区分今天和其他日子,从未配置不同样式
//item.date表示日期
return {
html: `<div>${item.date.getDate()}</div>`
}
},
}
8.同一时间段存在多个日程,显示会互相覆盖的问题
这个应该是我遇到最棘手的问题,效果如下图所示。
我想了很多办法,先是想通过强制写每个日程的宽度,让他们不覆盖,但是其中逻辑设计的太复杂,果然放弃了。
后来我发现一个问题,覆盖情况的发生都是后者覆盖前者,如果把后者和前者的位置一调换,是不是就解决了。按着这个想法,于是遭到了eventOrder这个配置项。具体配置如下:
options:
{
//duration 表示时间段 时间段越短 越排在前面
//start 表示开始时间 开始时间越早 越排在前面
//allDay 表示全天事件 全天事件优先排在前面
//title 表示标题 标题首字符排序
//此配置的优先顺序为:duration>start>allDay>title
eventOrder: 'duration,start,allDay,title'
}
配置之后,时间间隔长的就会排在后面,从而变相解决覆盖的问题。
又发现了一个新的字段,可以完美解决日程互相覆盖的问题,只需要把配置项 slotEventOverlap:false ,即可完美解决日程互相覆盖的问题。
9.原创不易,转载请标明出处,谢谢
更多推荐
所有评论(0)