我将 FullCalendar vue3 组件与 Laravel Breeze/Vue 一起使用,但我无法在需要时刷新日历。我希望日历在选择元素更改后刷新,以便为不同的用户显示新日历。
我正在使用 Vue3 组合 api,但我看不到如何强制刷新日历。我想我需要使用日历 api,但它似乎不起作用。
这是代码的缩小版:
<script setup>
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
import { reactive, ref, computed, watch, onMounted, onUnmounted, nextTick } from "vue";
import { Head, Link, useForm, router } from '@inertiajs/vue3';
import FullCalendar from '@fullcalendar/vue3';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction';
const props = defineProps({
'calendar_users': Object,
});
const calendarFor = reactive({
id: -1,
});
const calendarOptions = reactive({
plugins: [
dayGridPlugin,
timeGridPlugin,
interactionPlugin,
],
initialView: 'dayGridMonth',
headerToolbar: {
start: 'prevYear,nextYear prev,next today',
center: 'title',
end: 'dayGridMonth,timeGridWeek,timeGridDay'
},
events: '/get_events' + '?user=' + calendarFor.id,
height: 'auto',
});
function refresh_calendar() {
let calApi = this.$refs.fullCalendar.getApi();
calApi.refetchEvents();
}
</script>
<template>
<Head title="Calendar" />
<AuthenticatedLayout>
<template #header>
<h2 class="font-semibold text-xl text-gray-800">
Office Calendar
</h2>
</template>
<div class="py-3">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden sm:rounded-lg" id="CalendarScreen" name="CalendarScreen">
<div class="flex">
<div v-if="true" id="left_side" class="min-w-48 m-1 border">
<div class="flex mt-8">
<label for="calendarFor" class="ml-3 mr-4 font-bold text-lg">Calendar for:</label>
<select v-model="calendarFor.id" class=" border rounded-md" id="calendarFor" @change="refresh_calendar()">
<option value="-1">****</option>
<option v-for="calendar_user in props.calendar_users" :key="calendar_user.id" :value="calendar_user.id">
{{ calendar_user.initials }}
</option>
</select>
</div>
</div>
<div id="right_side" class="">
<div class="p-4 text-gray-900">
<FullCalendar ref='fullCalendar' :options="calendarOptions" />
</div>
</div>
</div>
</div>
</div>
</div>
</AuthenticatedLayout>
</template>
页面加载时,事件已加载并且没有错误。但是当我更改日历用户时调用refresh_calendar()函数时出现以下错误:
此外,这里还有来自 Vue Devtools 的一些信息,显示了日历组件的引用:
我做错了什么?如何让 fullcalendar vue3 组件根据所选用户进行刷新?
谢谢
如果有人很难让 Fullcalendar api 函数与合成 api 中的 Fullcalendar vue 组件一起使用,我想我应该发布这个。
答案已在上面的评论中进行了解释,引用了可能重复的问题。因为脚本设置在 DOM 加载之前运行,所以为了让事情正常工作,您需要在 onMounted 函数中调用 getApi() 。
这是我所做的基本概述:
<script setup>
import { reactive, ref, computed, watch, onMounted, onUnmounted, nextTick } from "vue";
import FullCalendar from '@fullcalendar/vue3';
import dayGridPlugin from '@fullcalendar/daygrid';
import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction';
const fullCalendar = ref(null);
let calApi = null;
const calendarOptions = reactive({
plugins: [
dayGridPlugin,
timeGridPlugin,
interactionPlugin,
],
...
});
onMounted(() => {
calApi = fullCalendar.value.getApi();
});
</script>
<template>
<FullCalendar ref='fullCalendar' :options="calendarOptions" />
</template>
然后,如果您需要做一些超出 calendarOptions 中可用的操作,您可以使用 calApi 变量调用任何 fullcalendar 函数,例如 calApi.refetchEvents();
感谢上面的 Estus Flask 帮助解决这个问题!