<full-calendar :events="monthData" class="test-fc" :config="config" ref="calendar" first-day="1" locale="fr" @event-selected="eventClick" @day-click="dayClick" @event-mouseover="eventMouseover" @event-mouseout="eventmouseout" @view-render='viewrender' ></full-calendar>
//https://www.npmjs.com/package/vue-fullcalendars,自己上传的包
在第三方插件加自定义事件封装好
利用的原理,子组件调用父组件方法,子组件绑定自定义事件且监听
<template>
<div ref="calendar" id="calendar"></div>
</template>
<script>
import defaultsDeep from 'lodash.defaultsdeep'
import 'fullcalendar'
import $ from 'jquery'
export default {
props: {
events: {
default() {
return []
},
},
eventSources: {
default() {
return []
},
},
editable: {
default() {
return true
},
},
selectable: {
default() {
return true
},
},
selectHelper: {
default() {
return true
},
},
header: {
default() {
return {
left: 'prev,next today',
center: 'title',
right: 'month,agendaWeek,agendaDay'
}
},
},
defaultView: {
default() {
return 'agendaWeek'
},
},
sync: {
default() {
return false
}
},
config: {
type: Object,
default() {
return {}
},
},
},
computed: {
defaultConfig() {
const self = this
return {
header: this.header,
defaultView: this.defaultView,
editable: this.editable,
selectable: this.selectable,
selectHelper: this.selectHelper,
aspectRatio: 2,
timeFormat: 'HH:mm',
events: this.events,
eventSources: this.eventSources,
eventRender(...args) {
if (this.sync) {
self.events = cal.fullCalendar('clientEvents')
}
self.$emit('event-render', ...args)
},
viewRender(...args) {
if (this.sync) {
self.events = cal.fullCalendar('clientEvents')
}
self.$emit('view-render', ...args)
},
eventDestroy(event) {
if (this.sync) {
self.events = cal.fullCalendar('clientEvents')
}
},
eventClick(...args) {
self.$emit('event-selected', ...args)
},
eventDrop(...args) {
self.$emit('event-drop', ...args)
},
eventReceive(...args) {
self.$emit('event-receive', ...args)
},
eventResize(...args) {
self.$emit('event-resize', ...args)
},
dayClick(...args){
self.$emit('day-click', ...args)
},
select(start, end, jsEvent, view, resource) {
self.$emit('event-created', {
start,
end,
allDay: !start.hasTime() && !end.hasTime(),
view,
resource
})
}
}
},
},
mounted() {
const cal = $(this.$el),
self = this
this.$on('remove-event', (event) => {
if(event && event.hasOwnProperty('id')){
$(this.$el).fullCalendar('removeEvents', event.id);
}else{
$(this.$el).fullCalendar('removeEvents', event);
}
})
this.$on('rerender-events', () => {
$(this.$el).fullCalendar('rerenderEvents')
})
this.$on('refetch-events', () => {
$(this.$el).fullCalendar('refetchEvents')
})
this.$on('render-event', (event) => {
$(this.$el).fullCalendar('renderEvent', event)
})
this.$on('reload-events', () => {
$(this.$el).fullCalendar('removeEvents')
$(this.$el).fullCalendar('addEventSource', this.events)
})
this.$on('rebuild-sources', () => {
$(this.$el).fullCalendar('removeEventSources')
this.eventSources.map(event => {
$(this.$el).fullCalendar('addEventSource', event)
})
})
cal.fullCalendar(defaultsDeep(this.config, this.defaultConfig))
},
methods: {
fireMethod(...options) {
return $(this.$el).fullCalendar(...options)
},
},
watch: {
events: {
deep: true,
handler(val) {
$(this.$el).fullCalendar('removeEvents')
$(this.$el).fullCalendar('addEventSource', this.events)
},
},
eventSources: {
deep: true,
handler(val) {
this.$emit('rebuild-sources')
},
},
},
beforeDestroy() {
this.$off('remove-event')
this.$off('rerender-events')
this.$off('refetch-events')
this.$off('render-event')
this.$off('reload-events')
this.$off('rebuild-sources')
},
}
</script>
浙公网安备 33010602011771号