FullCalendar5.+在vue中一些有用的使用


最近想做一个类似飞书上日程管理的小demo,不愿意重复造轮子(其实是水准不够),选来选去选择了FullCalendar.js库。

虽然FullCalendar是一个jQuary的库,但是其实它的4.0+已经支持了vue,并且功能上,fullCalendar支持月历、周历、日程、日程精细到时间等等,非常的全面。

如何使用可以参考这一篇,写得很详细,但是目前fullCalendar已经出到5.+了,所以一些接口字段也有变化:

https://www.cnblogs.com/czk1634798848/p/13386178.html

本文就是依据我demo的需求,对上文没有提及的地方进行小小的补充~

需求一:header自定义

FullCalendar的header可以选择在左中右如何排布按钮和title的顺序,也支持(仅支持)自定义按钮,自定义按钮也仅支持有限的三种风格。

但是现在应该比较少人使用默认的bootstrap风格和图标了,那么如何自定义按钮和文字等header元素呢?

首先,在想要放我们自己的文字的地方加入自定义按钮

然后,在mount钩子的回调里面,找到我们自定义按钮,利用原生js,将它替换成我们想要的节点

最后,调整ui样式。

mount这个生命周期钩子,在5.+的版本里面,叫做eventDidMount,替换了之前版本的多个回调,需要注意一下。

上代码:

 1 calendarOptions: {
 2         // 一些其它配置,省略
 3         // 。。。。。
 4         //header配置
 5         // 自定义按钮(其实包含文字,自定义图标等,通过自定义按钮的接口实现)
 6         customButtons: {
 7           // 自定义整个页面的标题
 8           calendarTitle: {
 9             theme: "true",
10             text: "",
11             click: function () {
12               alert("clicked the custom button!");
13             },
14           },
15           // 自定义一个设置图标按键
16           setting: {
17             theme: "true",
18             text: "",
19             click: function () {
20               alert("clicked the custom button!");
21             },
22           },
23         },
24         headerToolbar: {
25           // 日历头部按钮位置
26           left: "calendarTitle",
27           center: "prev title next",
28           right: "today dayGridWeek,dayGridMonth setting",
29         },
30         buttonText: {
31           today: "今天",
32           month: "月",
33           week: "周",
34         },
35         // 日历生命周期钩子,在这时对header进行div操作
36         eventDidMount: () => {
37           if (!this.$refs.myCalendar.$el.querySelector(".header-title")) {
38             let parentsDiv = this.$refs.myCalendar.$el.querySelector(
39               ".fc-toolbar-chunk"
40             );
41             let calendarDiv = this.$refs.myCalendar.$el.querySelector(
42               ".fc-calendarTitle-button"
43             );
44             // console.log(calendarDiv);
45             let titleEle = document.createElement("DIV");
46             titleEle.innerHTML = '<div class="header-title">日程</div>';
47             parentsDiv.insertBefore(titleEle, calendarDiv);
48             calendarDiv.style.display = 'none';
49           }
50           if (!this.$refs.myCalendar.$el.querySelector(".header-setting-btn")) {
51             let parentsDivs = this.$refs.myCalendar.$el.querySelectorAll(
52               ".fc-toolbar-chunk"
53             );
54             let parentsDiv = parentsDivs[parentsDivs.length - 1]
55             let settingBtnDiv = this.$refs.myCalendar.$el.querySelector(
56               ".fc-setting-button"
57             );
58             let settingEle = document.createElement("DIV");
59             settingEle.innerHTML = '<div class="header-setting-btn"></div>';
60             // console.log(settingEle);
61             parentsDiv.insertBefore(settingEle, settingBtnDiv);
62             settingBtnDiv.style.display = 'none';
63           }
64 
65         },

关于调整ui样式,虽然FullCanlendar中也开放了一些接口如viewClassNames等,但是如果有比较严格的ui图作为参考,仅仅利用它默认开放的classNames,不是很够用,阅读文档又很头痛,这里分享一种无脑覆盖ui的方式,适合各种ui库的个性化改造哦~

第一步 在src下添加styles文件夹,里面定义一个public.css或public.scss,作为全局的css文件;

第二步 在main.js中把这个public.css导入:

import '@/styles/public.scss'

第三步 打开浏览器的devtools,检查想要修改的元素,找到class name;

第四步 在public.css里,直接写样式覆盖掉原来的定义

就可以啦~


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM