2つ以上の相互運用可能なソート可能リストを使用する場合、monitor.isDragging()は、あるコンテナーから別のコンテナーにアイテムをドラッグするときにtrueを返す必要があるときにfalseを返すことがあります。
セットアップ:単純な並べ替え可能なデモから始めて、別のコンテナーと並べ替え可能なオブジェクトのセットを追加します。 カードは、あるコンテナから別のコンテナにドラッグ可能であり、独自のコンテナ内で並べ替えることができ、あるコンテナから別のコンテナにドラッグするときに並べ替えることができます。
この問題は、あるコンテナから別のコンテナにカードを移動するときに発生します。 カードコンポーネントは、不透明度を決定するためにisDraggingプロパティ(DragSourceデコレータによって挿入される)に依存しますが、アイテムが1つのコンテナから別のコンテナにドラッグされると、グローバルモニターは、ドラッグされたコンポーネントと一致しなくなったsourceIdを変更し、最終的に戻ります。 trueを返す必要があるときにisDraggingを呼び出す場合はfalse。
ドラッグソースは、ドラッグ可能なオブジェクトごとに一貫したグローバルに一意のキーをすでに必要としているため(ドラッグ可能なコンポーネントのキーがいつでも変更されると、他のものは実際に誤動作します)、1つのコンテナーからのドラッグが正しく機能するように、コードはsourceIdを指定するときにそのキーを使用できますか?
サンプルコードを見る必要がある場合はお知らせください。 この問題を示す私のコードは、単純なソート可能なデモに基づいています。
@amoenkはい、役立つサンプルコードが必要になります。
あなたのコードを調べましたが、 DnDStudy
コンポーネントが見つからないようです。 あなたの完全なコードとあなただけのコードを見せてくれませんか。 デモコードを削除できます。
デモコードが削除されました。DnDStudyコンポーネントは次のページコンポーネントです: http ://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js
確認しましたが、 IngredientGroup
内のDnDStudy
IngredientGroup
キーが原因で問題が発生している可能性があると思います。 配列のインデックスに依存する代わりに、 Ingredient
内のIngredientGroup
Ingredient
と同様の一意のIDを使用してみてください。
コードは更新されましたが、それでも同じ問題です。
Ok。 その時私は間違っていました。
@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/へのリンクが応答していません...
問題の根本的な原因を見つけました。 DropTargetsとDragSourcesをラップするためにDragDropContextProviderの使用を停止する必要がありました。 以下の例を参照してください。
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
ドキュメントを参照してください:これは役に立ちますか?