Lors de l'utilisation d'au moins deux listes triables interopérables, monitor.isDragging() renvoie parfois false alors qu'il devrait renvoyer true lors du déplacement d'un élément d'un conteneur à l'autre.
Configuration : à partir de la simple démo triable, ajoutez un autre conteneur et un ensemble d'objets triables. Les cartes doivent pouvoir être déplacées d'un conteneur à l'autre, triées dans leur propre conteneur et triées lorsqu'elles sont glissées d'un conteneur à l'autre.
Le problème se produit lors du déplacement d'une carte d'un conteneur à l'autre. Le composant de carte dépend de la propriété isDragging (injectée par le décorateur DragSource) pour déterminer l'opacité, cependant, lorsque l'élément est glissé d'un conteneur à l'autre, le moniteur global modifie le sourceId qui ne correspond plus au composant glissé et finit par retourner false pour les appels à isDragging alors qu'il doit retourner true.
Étant donné que le dragsource nécessite déjà une clé globalement unique et cohérente par objet déplaçable (d'autres choses se comportent vraiment mal si les clés de votre composant déplaçable changent à tout moment), le code peut-il utiliser cette clé lors de la désignation du sourceId afin que le glissement à partir d'un conteneur fonctionne correctement ?
Faites-moi savoir si vous avez besoin de voir l'exemple de code. Mon code démontrant ce problème est basé sur la simple démo triable.
@amoenk Oui, nous aurons besoin d'un exemple de code pour vous aider.
Merci pour ton aide! Voici l'exemple de travail : http://notlouieagain.com/~amoenk/dnd/
Et ce lien pour parcourir le code dégroupé : http://notlouieagain.com/~amoenk/dnd/js/
Oh, j'y ai également inclus le code de démonstration triable simple d'origine pendant le débogage, mais les composants importants sont Ingredient et IngredientGroup.
J'ai regardé votre code et je n'arrive pas à trouver le composant DnDStudy
. Pouvez-vous me montrer votre code complet et uniquement le vôtre. Vous pouvez supprimer le code de démonstration.
Code de démonstration supprimé, le composant DnDStudy est un composant de page ici : http://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js
Ok, j'ai jeté un coup d'œil et je pense que cela peut être un problème à cause des clés de IngredientGroup
intérieur de DnDStudy
. Au lieu de vous fier à l'index du tableau, essayez d'utiliser un identifiant unique similaire à celui de Ingredient
intérieur de IngredientGroup
.
Code mis à jour, mais toujours le même problème.
D'accord. J'avais tort alors.
@gaearon pouvez-vous m'aider ?
Pour que isDragging
fonctionne dans l'arborescence des composants, veuillez implémenter manuellement isDragging
sur votre source de glissement.
const ingredientSource = {
beginDrag(props) {
return { ingredient: props.ingredient };
},
isDragging(props, monitor) {
return props.ingredient === monitor.getItem().ingredient;
}
};
Voir les DragSource
docs :
isDragging(props, monitor)
: Facultatif. Par défaut, seule la source de glissement qui a initié l'opération de glissement est considérée comme faisant glisser. Vous pouvez remplacer ce comportement en définissant une méthodeisDragging
. Il peut renvoyer quelque chose commeprops.id === monitor.getItem().id
. Faites-le si le composant d'origine peut être démonté pendant le déplacement et plus tard « ressuscité » avec un parent différent. Par exemple, lorsque vous déplacez une carte à travers les listes d'un tableau Kanban, vous souhaitez qu'elle conserve l'apparence déplacée, même si techniquement, le composant est démonté et un autre est monté chaque fois que vous le déplacez vers une autre liste. _Remarque : Vous ne pouvez pas appelermonitor.isDragging()
dans cette méthode._
est-ce que cela aide?
Fonctionne parfaitement! J'ai dû manquer ça dans la doc.
Merci pour votre aide! Je vais fermer le ticket.
Aucun problème. Heureux d'aider.
euh ! Les liens vers http://notlouieagain.com/ ne répondent pas...
J'ai trouvé la cause première de mon problème. J'ai dû arrêter d'utiliser DragDropContextProvider pour envelopper mes DropTargets et DragSources. Voir l'exemple ci-dessous.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context-provider.html
export default class YourApp {
render() {
return (
<DragDropContextProvider backend={HTML5Backend}>
/* ... */
</DragDropContextProvider>
)
}
}
Au lieu de cela, j'ai dû utiliser le DragDropContext pour envelopper toute ma classe comme ci-dessous.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html
class YourApp {
/* ... */
}
export default DragDropContext(HTML5Backend)(YourApp)
Cela a immédiatement résolu le problème pour moi.
Commentaire le plus utile
Pour que
isDragging
fonctionne dans l'arborescence des composants, veuillez implémenter manuellementisDragging
sur votre source de glissement.Voir les
DragSource
docs :est-ce que cela aide?