React-dnd: monitor.isDragging() 有时在应该返回 true 时返回 false

创建于 2015-07-09  ·  12评论  ·  资料来源: react-dnd/react-dnd

当使用两个或多个可互操作的可排序列表时,monitor.isDragging() 有时会返回 false,而在将项目从一个容器拖动到另一个容器时它应该返回 true。

设置:从简单的可排序演示开始,添加另一个容器和一组可排序对象。 卡片应该可以从一个容器拖到另一个容器,可以在它们自己的容器内排序,并且在从一个容器拖到另一个容器时可以排序。

将卡从一个容器移动到另一个容器时会出现此问题。 卡片组件依赖于 isDragging 属性(由 DragSource 装饰器注入)来确定不透明度,但是,当项目从一个容器拖到另一个容器时,全局监视器会更改不再与拖动组件匹配的 sourceId 并最终返回当调用 isDragging 应该返回 true 时为 false。

由于dragsource 已经要求每个可拖动对象具有一致的全局唯一键(如果您的可拖动组件的键在任何时候发生变化,其他东西确实会行为不端),那么代码在指定sourceId 时是否可以使用该键,以便从一个容器中拖动可以正常工作?

如果您需要查看示例代码,请告诉我。 我演示此问题的代码基于简单的可排序演示。

最有用的评论

要让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() 。_

这有帮助吗?

所有12条评论

@amoenk是的,我们需要示例代码来帮助您。

谢谢你的帮助! 这是工作示例: http :

以及浏览未捆绑代码的链接: http :

哦,我在调试的时候也把原始的简单的可排序的演示代码放在那里,但重要的组件是 Ingredient 和 IngredientGroup。

我查看了您的代码,但似乎找不到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)

这立即为我解决了问题。

此页面是否有帮助?
0 / 5 - 0 等级