React DnD拖拽时,目标区域样式无法更新怎么办?
在用React DnD实现拖拽排序列表时,我想让目标区域在拖拽进入时显示高亮背景,但尝试了半小时样式就是没反应。
已经按照文档在可Drop组件里用canDrop和isOver监控状态,代码是这样写的:
const [{ isOver }, drop] = useDrop({
accept: ItemTypes.TASK,
collect: (monitor) => ({
isOver: monitor.isOver(),
}),
drop: (item) => handleDrop(item),
});
return (
<div ref={drop} style={{
backgroundColor: isOver ? 'lightblue' : 'white',
padding: '1rem'
}}>
{children}
</div>
);
控制台没报错,但拖拽到区域时背景色完全没变化。之前尝试把isOver改成固定值’lightblue’,发现样式又能生效了,这说明是状态传递哪里有问题?
isOver的判断逻辑。你现在的代码只检查了monitor.isOver(),但没有验证拖拽的项是否真的可以被放置到目标区域。根据 React DnD 的文档,monitor.isOver()只表示鼠标是否悬停在目标组件上,而monitor.canDrop()才是用来判断当前拖拽项是否能被放置的。推荐的做法是同时检查
isOver和canDrop,这样才能确保样式的更新符合预期。以下是修改后的代码:这样改完后,背景色会在拖拽进入且可以放置时高亮。如果你发现还是没反应,检查一下
accept的类型是否和拖拽源的类型匹配,或者看看handleDrop是否有逻辑问题导致状态没正确更新。顺便吐槽一句,React DnD 的文档有时候确实有点绕,尤其是新手容易忽略这些细节。希望这个调整能帮你解决问题。
monitor.isOver({ shallow: true }),默认是深度比较,拖拽对象结构复杂时会失效。