当使用两个或多个可互操作的可排序列表时,monitor.isDragging() 有时会返回 false,而在将项目从一个容器拖动到另一个容器时它应该返回 true。
设置:从简单的可排序演示开始,添加另一个容器和一组可排序对象。 卡片应该可以从一个容器拖到另一个容器,可以在它们自己的容器内排序,并且在从一个容器拖到另一个容器时可以排序。
将卡从一个容器移动到另一个容器时会出现此问题。 卡片组件依赖于 isDragging 属性(由 DragSource 装饰器注入)来确定不透明度,但是,当项目从一个容器拖到另一个容器时,全局监视器会更改不再与拖动组件匹配的 sourceId 并最终返回当调用 isDragging 应该返回 true 时为 false。
由于dragsource 已经要求每个可拖动对象具有一致的全局唯一键(如果您的可拖动组件的键在任何时候发生变化,其他东西确实会行为不端),那么代码在指定sourceId 时是否可以使用该键,以便从一个容器中拖动可以正常工作?
如果您需要查看示例代码,请告诉我。 我演示此问题的代码基于简单的可排序演示。
@amoenk是的,我们需要示例代码来帮助您。
我查看了您的代码,但似乎找不到DnDStudy
组件。 你能告诉我你的完整代码吗,只有你的。 您可以删除演示代码。
Demo 代码去掉了,DnDStudy 组件是这里的页面组件: http ://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js
好的,我看了一下,我相信这可能是由于DnDStudy
内的IngredientGroup
键造成的问题。 与其依赖数组的索引,不如尝试在IngredientGroup
使用类似于Ingredient
唯一 ID。
代码更新了,但还是一样的问题。
行。 那时我错了。
@gaearon你能帮忙吗?
要让isDragging
跨组件树工作,请在拖动源上手动实现isDragging
。
const ingredientSource = {
beginDrag(props) {
return { ingredient: props.ingredient };
},
isDragging(props, monitor) {
return props.ingredient === monitor.getItem().ingredient;
}
};
请参阅DragSource
文档:
isDragging(props, monitor)
:可选。 默认情况下,只有发起拖动操作的拖动源才被认为是拖动。 您可以通过定义自定义isDragging
方法来覆盖此行为。 它可能会返回类似props.id === monitor.getItem().id
。 如果原始组件可能在拖动过程中被卸载,然后在不同的父组件中“复活”,请执行此操作。 例如,当在看板中的列表中移动卡片时,您希望它保留拖动的外观——即使从技术上讲,组件会被卸载,并且每次移动到另一个列表时都会安装一个不同的组件。 _注意:您不能在此方法中调用monitor.isDragging()
。_
这有帮助吗?
完美运行! 一定是在文档中遗漏了这一点。
感谢你的帮助! 我将关闭票。
没问题。 乐于帮助。
嗯! 指向http://notlouieagain.com/ 的链接没有响应......
我找到了问题的根本原因。 我不得不停止使用 DragDropContextProvider 来包装我的 DropTargets 和 DragSources。 请参阅下面的示例。
http://react-dnd.github.io/react-dnd/docs-drag-drop-context-provider.html
export default class YourApp {
render() {
return (
<DragDropContextProvider backend={HTML5Backend}>
/* ... */
</DragDropContextProvider>
)
}
}
相反,我必须使用 DragDropContext 来包装我的整个类,如下所示。
http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html
class YourApp {
/* ... */
}
export default DragDropContext(HTML5Backend)(YourApp)
这立即为我解决了问题。
最有用的评论
要让
isDragging
跨组件树工作,请在拖动源上手动实现isDragging
。请参阅
DragSource
文档:这有帮助吗?