阐明
FullCalendar
版本为 5.x,Vue
版本为 2.x
次要内容
- 去除默认 headerToolbar,自定义工具栏;
- 任意月份跳转,可返回以后月份;
- 增加事件;
- 查看事件详情(点击)
成果
代码
为了了解和应用,合并简化了代码。主性能流程简洁明了,可依据理论需要场景 DIY。
代码中工夫格式化选用 day.js,可依据我的项目更改工夫格式化办法
引入依赖
$ npm i @fullcalendar/core @fullcalendar/daygrid @fullcalendar/interaction @fullcalendar/vue
Calendar.vue
<template> <div> <div class="toolbar-boxer"> <div> <el-date-picker v-model="selectMonth" type="month" :clearable="false" placeholder="抉择月" value-format="yyyy-MM" @change="handleDatePick"> </el-date-picker> <el-button class="margin-left" v-if="btnReturnCurrenMonthVisiable" @click="handleReturnCurrentMonth">返回今日</el-button> </div> <div class="toolbar-right"> <el-button type="primary" @click="handleAddEvent">增加课程</el-button> </div> </div> <full-calendar ref="fullCalendar" class="calendar" :options="calendarOptions" /> </div></template><script>import FullCalendar from '@fullcalendar/vue'import dayGridPlugin from '@fullcalendar/daygrid'import interactionPlugin from '@fullcalendar/interaction'import dayjs from 'dayjs'export default { props: { events: { type: Array, default: () => [] } }, watch: { // 监听事件list的变动,更新界面 events (newVal, oldVal) { this.calendarOptions.events = newVal } }, data () { return { btnReturnCurrenMonthVisiable: false, currentDate: null, selectMonth: null, // 以后抉择的月份 calendarApi: null, calendarOptions: { plugins: [ dayGridPlugin, interactionPlugin ], initialView: 'dayGridMonth', locale: 'zh-cn', headerToolbar: false, // 不显示头部 toolbar // headerToolbar: { // start: 'addEventBtn', // center: 'title' // }, events: this.events, eventTimeFormat: { // 事件工夫的格式化 hour: 'numeric', minute: '2-digit', hour12: false }, displayEventEnd: true, // 事件显示完结工夫 eventClick: this.handleEventClick }, } }, mounted () { this.calendarApi = this.$refs.fullCalendar.getApi() this.currentDate = dayjs(this.calendarApi.getDate()).format('YYYY-MM') this.selectMonth = this.currentDate }, methods: { /** * 点击事件 */ handleEventClick (eventClickInfo) { this.$emit('onEventClick', eventClickInfo) }, /** * 增加事件 */ handleAddEvent () { this.$emit('onAddEvent') }, /** * 下拉抉择日期并跳转至相应月份 */ handleDatePick (month) { // 抉择了别的月份,则显示返回今日按钮 this.btnReturnCurrenMonthVisiable = month !== this.currentDate this.calendarApi.gotoDate(month) }, /** * 返回以后月份 */ handleReturnCurrentMonth () { this.calendarApi.gotoDate(this.currentDate) this.btnReturnCurrenMonthVisiable = false this.selectMonth = this.currentDate }, }, components: { FullCalendar },}</script><style scoped>.toolbar-boxer { display: flex; flex-direction: row; justify-content: space-between;}.toolbar-right { text-align: right;}.calendar { margin-top: 1rem;}.margin-left { margin-left: 1rem;}</style>
在页面中应用 Calendar.vue
组件
xxx.vue
<template> <calendar :events="dataEventList" @onAddEvent="onAddEvent" @onEventClick="onEventClick" /></template><script>import Calendar from '@/components/Calendar'export default { data () { return { dataEventList [], // 事件 list } }, methods: { /** * 增加事件 Demo */ onAddEvent () { // Event 数据根本构造,可增加自定义属性 this.dataEventList.push({ title: '事件名称', start: '0000-00-00 00:00:00', // 开始工夫 end: '0000-00-00 00:00:00', // 完结工夫 customAttribute: 'hello world', // 可增加自定义属性,便于在查看详情时获取应用 }) }, /** * 点击事件,查看事件详情 */ onEventClick (eventInfo) { // _event: { title, start, end } const _event = eventInfo.event // _props: { customAttribute, ... } const _props = _event._def.extendedProps // todo 依据应用场景展现事件详情或执行动作 }, }, components: { Calendar },}</script>