Vue.js中删除事件后如何重新渲染FullCalendar组件
解决Vue中FullCalendar删除事件后视图不更新的问题
嘿,我懂你现在的糟心情况——事件明明从数据库删了,日历视图却还挂着,只能靠刷新路由凑活,这体验确实够差的。其实不用这么折腾,FullCalendar本身就支持响应式更新,而且你之前用key没生效,大概率是没正确触发key的变化,我给你两种靠谱的解决方案:
方案一:直接更新EVENTS数组(推荐)
FullCalendar的events属性是响应式的,只要你修改绑定的EVENTS数组,它就会自动重新渲染日历视图,这是最符合Vue和FullCalendar设计逻辑的做法,比强制刷新组件高效多了。
修改你删除成功后的回调逻辑:
.then(answer => { // 从本地EVENTS数组中过滤掉被删除的事件 this.EVENTS = this.EVENTS.filter(event => { // 用事件的标题和开始时间做匹配,和你删除的条件保持一致 return !( event.title === arg.event._def.title && event.start.getTime() === arg.event._instance.range.start.getTime() ) }) // 这里完全不需要刷新路由,日历会自动更新! })
注意点:
- 确保
EVENTS是在Vue组件的data中定义的响应式数据 - 用
filter返回新数组的方式更新,而不是直接修改原数组元素(Vue对数组的push/splice也支持响应,但返回新数组更稳妥) - 如果你的事件列表是从后端获取的,也可以在删除成功后重新调用接口拉取最新列表,再赋值给
EVENTS
方案二:正确使用key强制刷新组件
如果你还是想用key的方式刷新组件,要确保componentKey的值真的发生了变化——因为只有当key的值改变时,Vue才会销毁旧组件并创建新组件。
首先在组件的data里定义componentKey:
data() { return { componentKey: 0, // 其他数据... } }
然后在删除成功的回调里修改componentKey:
.then(answer => { // 改变componentKey的值,触发组件重新渲染 this.componentKey += 1 })
之前你的key方法无效,大概率是没正确更新componentKey的值,或者更新方式没触发Vue的响应式检测(用数字累加这种简单操作就不会有问题)。
为什么路由刷新能解决?
因为路由刷新会重新加载整个组件,相当于重新初始化了FullCalendar,所以能拿到最新的事件数据,但这是最笨的方法,用户体验也差,咱们用上面两种方法就能完美避免。
内容的提问来源于stack exchange,提问作者Jorge Nicolas Ortiz Gualteros




