React-dnd: monitor.isDragging() renvoie parfois false alors qu'il devrait renvoyer true

Créé le 9 juil. 2015  ·  12Commentaires  ·  Source: react-dnd/react-dnd

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.

Commentaire le plus utile

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éthode isDragging . Il peut renvoyer quelque chose comme props.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 appeler monitor.isDragging() dans cette méthode._

est-ce que cela aide?

Tous les 12 commentaires

@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éthode isDragging . Il peut renvoyer quelque chose comme props.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 appeler monitor.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.

Cette page vous a été utile?
0 / 5 - 0 notes