Version
4.2.6
Environment
win10, chrome:143.0.7499.170(正式版本),"vue": "^3.5.13"
Reproduction link

Steps to reproduce
- 在 Tree 组件上设置
draggable={true}
- 因为没办法单独控制单个节点是否可拖拽,实现 dragstart 事件处理器,在处理器中检查节点是否可拖拽
- 对于不可拖拽的节点,在 dragstart 中调用 event.preventDefault() 和 event.stopPropagation()
- 点击选中任意一个节点(比如节点 A)
- 尝试拖拽一个不可拖拽的节点(比如节点 B),也会显示选中样式,出现两个选中节点
- 继续尝试拖拽其他不可拖拽节点,会继续增加选中样式
关键问题:preventDefault() 只阻止了浏览器的默认拖拽行为,但 antd 已经:
- 设置了内部状态(dragState)
- 添加了CSS class(dragging)
- 注册了清理监听器
由于没有触发 dragend 事件,这些状态和样式没有被清理。
What is expected?
不可拖拽节点 B:拖拽操作应该完全失败,没有任何视觉变化,不应该显示选中样式,从源头控制该节点拖拽行为
已选中节点 A:应该保持原有选中状态不变
建议的解决方案
- 方案 A:增强 draggable 属性,支持函数形式
- 方案 B:提供分离的拖拽控制 API
<a-tree draggable :drag-check="checkIfNodeDraggable" />
What is actually happening?
不可拖拽节点 B:
- 拖拽操作确实被 preventDefault() 阻止了
- 但是节点 B 会显示选中样式(蓝色背景)
已选中节点 A:仍然显示选中样式
最终选择状态:节点 A 和节点 B 同时显示选中样式,出现多选
Version
4.2.6
Environment
win10, chrome:143.0.7499.170(正式版本),"vue": "^3.5.13"
Reproduction link
Steps to reproduce
draggable={true}关键问题:preventDefault() 只阻止了浏览器的默认拖拽行为,但 antd 已经:
由于没有触发 dragend 事件,这些状态和样式没有被清理。
What is expected?
不可拖拽节点 B:拖拽操作应该完全失败,没有任何视觉变化,不应该显示选中样式,从源头控制该节点拖拽行为
已选中节点 A:应该保持原有选中状态不变
建议的解决方案
<a-tree draggable :drag-check="checkIfNodeDraggable" />What is actually happening?
不可拖拽节点 B:
已选中节点 A:仍然显示选中样式
最终选择状态:节点 A 和节点 B 同时显示选中样式,出现多选