点击showBom后拖拽数据至FullCalendar出现批量重复添加问题排查
问题根因分析
核心原因:拖拽事件重复绑定
每次调用showBom(index)获取并渲染BOM表格时,重复给表格行添加了拖拽监听事件,且未在重新渲染前清除旧的监听逻辑。
- 首次点击
showBom:表格渲染后,给行绑定1次「拖拽触发添加日历」的逻辑; - 第二次点击
showBom:新表格渲染时,未移除之前的监听,再次给行绑定第2次相同逻辑; - 以此类推,点击N次后,拖拽一行会触发N次添加逻辑,最终导致N条重复数据被同步到日历。
常见代码场景佐证
这类问题通常出现在以下两种写法中:
- 在
showBom方法内直接绑定拖拽事件,未做去重处理:
showBom(index) { // 获取BOM数据 this.bomData = await fetchBomData(index) // 每次调用都新增监听,未清除旧监听 this.$nextTick(() => { document.querySelectorAll('.bom-table-row').forEach(row => { row.addEventListener('dragend', this.handleDragToCalendar) }) }) }
- 使用第三方拖拽库时,未销毁旧实例就重复初始化:
showBom(index) { this.bomData = await fetchBomData(index) this.$nextTick(() => { // 未销毁之前的Sortable实例,直接创建新实例导致多监听叠加 new Sortable(document.querySelector('.bom-table'), { onEnd: this.handleDragToCalendar }) }) }
次要可能:响应式状态残留
如果handleDragToCalendar方法依赖的响应式数据在showBom调用时未重置,也可能导致多次触发,但最普遍的诱因还是事件监听的重复绑定。
内容的提问来源于stack exchange,提问作者user19395617
相关产品推荐
相关产品推荐

