
本文旨在解决在使用Vue FullCalendar组件时,通过点击按钮一次性加载多个BOM数据到日历中导致的问题。通过分析问题代码,并结合解决方案,提供了一个清晰的步骤,帮助开发者避免数据重复加载,并确保FullCalendar组件的正常使用。
在使用Vue FullCalendar组件时,如果在点击按钮触发数据加载时,发现数据被重复加载到日历中,这通常是由于监听器(watcher)的重复触发或初始化逻辑不当造成的。在提供的代码中,getBomData 的 watch 监听器,配合 immediate: true 可能会导致在组件挂载时和数据更新时都执行 initializeDraggable() 方法,从而重复初始化拖拽功能,导致数据重复加载。
解决方案是将 watch 监听器中的 initializeDraggable() 调用移除,并在 mounted 钩子函数中手动调用一次,确保只在组件挂载后进行一次初始化。
移除watch监听器:
立即学习“前端免费学习笔记(深入)”;
首先,移除以下代码块:
watch: {
getBomData: {
handler() {
this.$nextTick(() => {
this.initializeDraggable();
});
},
deep: true,
immediate: true,
},
}这段代码会导致 getBomData 每次变化时都执行 initializeDraggable(),从而重复初始化拖拽功能。
在mounted钩子中调用initializeDraggable:
确保 initializeDraggable() 方法在 mounted 钩子函数中被调用。 检查mounted中是否存在调用,若没有,则添加。
async mounted() {
const payload = {
product_unit: this.productUnit,
}
await this.$store.dispatch('getBom', payload)
this.bomDatas = this.getBomData ? [...this.getBomData] : []
this.calendarOptions.resources = this.facilityDatas.map((facility, index) => ({
id: index.toString(),
title: facility.facility_name,
}))
await this.initializeDraggable() // 确保这里调用了 initializeDraggable()
this.fullCalendar = this.$refs.fullCalendar.$refs.calendar
},这样可以确保在组件挂载后,拖拽功能只被初始化一次。
<template>
<!-- Your template code here -->
</template>
<script>
import processList from '@/components/detail/processList.vue'
import equipmentList from '@/components/detail/equipmentList.vue'
import { mapGetters } from 'vuex'
import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import interactionPlugin, { Draggable } from '@fullcalendar/interaction'
import resourceTimelinePlugin from '@fullcalendar/resource-timeline'
export default {
components: {
FullCalendar,
processList,
equipmentList,
},
data() {
return {
draggedData: null,
calendarOptions: {
// ... calendar options
},
removeAfterDrop: false,
calendarEvents: [],
}
},
computed: {
// ... computed properties
},
async mounted() {
const payload = {
product_unit: this.productUnit,
}
await this.$store.dispatch('getBom', payload)
this.bomDatas = this.getBomData ? [...this.getBomData] : []
this.calendarOptions.resources = this.facilityDatas.map((facility, index) => ({
id: index.toString(),
title: facility.facility_name,
}))
await this.initializeDraggable()
this.fullCalendar = this.$refs.fullCalendar.$refs.calendar
},
methods: {
// ... methods
initializeDraggable() {
const containerEl = document.getElementById('external-events')
if (containerEl) {
const eventElements = containerEl.getElementsByClassName('fc-event')
Array.from(eventElements).forEach((eventEl, index) => {
new Draggable(eventEl, {
eventData: () => {
const bomData = this.bomDatas[index]
return {
title: `${bomData.product_unit} - ${bomData.process}`,
}
},
})
eventEl.addEventListener('dragstart', (event) => {
const bomData = this.bomDatas[index]
const dragData = {
product_unit: bomData.product_unit,
process_name: bomData.process_name,
}
event.dataTransfer.setData('text', JSON.stringify(bomData))
this.draggedData = dragData
})
})
const calendarContainerEl = document.getElementById('calendar-container')
if (calendarContainerEl) {
calendarContainerEl.addEventListener('drop', this.handleDrop)
calendarContainerEl.addEventListener('dragover', this.handleDragOver)
}
}
},
},
}
</script>通过移除不必要的 watch 监听器,并在 mounted 钩子函数中手动调用 initializeDraggable() 方法,可以有效地解决Vue FullCalendar组件中BOM数据重复加载的问题。 这种方法确保了拖拽功能只在组件挂载后初始化一次,避免了数据重复加载,从而保证了FullCalendar组件的正常使用。 记住,理解Vue组件的生命周期以及如何正确使用监听器是解决此类问题的关键。
以上就是解决Vue FullCalendar同时加载多个BOM数据的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号