You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动