React-dnd: monitor.isDragging() gibt manchmal false zurück, wenn es true zurückgeben sollte

Erstellt am 9. Juli 2015  ·  12Kommentare  ·  Quelle: react-dnd/react-dnd

Wenn zwei oder mehr interoperable sortierbare Listen verwendet werden, gibt monitor.isDragging() manchmal false zurück, wenn es true zurückgeben sollte, wenn ein Element von einem Container in den anderen gezogen wird.

Einrichtung: Beginnen Sie mit der einfachen sortierbaren Demo, fügen Sie einen weiteren Container und einen Satz sortierbarer Objekte hinzu. Karten sollten von einem Container in den anderen gezogen werden können, innerhalb ihres eigenen Containers sortierbar und sortierbar sein, wenn sie von einem Container in den anderen gezogen werden.

Das Problem tritt auf, wenn eine Karte von einem Container in den anderen verschoben wird. Die Kartenkomponente hängt von der isDragging-Eigenschaft (injiziert vom DragSource-Dekorator) ab, um die Deckkraft zu bestimmen. Wenn das Element jedoch von einem Container in den anderen gezogen wird, ändert der globale Monitor die sourceId, die nicht mehr mit der gezogenen Komponente übereinstimmt und am Ende zurückgegeben wird false für Aufrufe von isDragging, wenn es true zurückgeben soll.

Da die Dragsource bereits einen konsistenten global eindeutigen Schlüssel pro ziehbarem Objekt erfordert (andere Dinge verhalten sich wirklich schlecht, wenn sich die Schlüssel Ihrer ziehbaren Komponente jederzeit ändern), kann der Code diesen Schlüssel verwenden, wenn er die sourceId festlegt, damit das Ziehen aus einem Container korrekt funktioniert?

Lassen Sie es mich wissen, wenn Sie den Beispielcode sehen möchten. Mein Code, der dieses Problem demonstriert, basiert auf der einfachen sortierbaren Demo.

Hilfreichster Kommentar

Damit isDragging im Komponentenbaum funktioniert, implementieren Sie bitte manuell isDragging in Ihrer Drag-Quelle.

const ingredientSource = {
    beginDrag(props) {
        return { ingredient: props.ingredient };
    },
    isDragging(props, monitor) {
        return props.ingredient === monitor.getItem().ingredient;
    }
};

Siehe DragSource Dokumente :

isDragging(props, monitor) : Optional. Standardmäßig wird nur die Ziehquelle, die den Ziehvorgang initiiert hat, als Ziehen betrachtet. Sie können dieses Verhalten überschreiben, indem Sie eine benutzerdefinierte isDragging Methode definieren. Es könnte etwas wie props.id === monitor.getItem().id . Tun Sie dies, wenn die Originalkomponente während des Ziehens ausgehängt und später mit einem anderen Elternteil „wiederbelebt“ wird. Wenn Sie beispielsweise eine Karte über die Listen in einem Kanban-Board verschieben, möchten Sie, dass sie das gezogene Erscheinungsbild behält – obwohl die Komponente technisch gesehen ausgehängt und jedes Mal eine andere angebracht wird, wenn Sie sie in eine andere Liste verschieben. _Hinweis: Sie dürfen monitor.isDragging() innerhalb dieser Methode nicht aufrufen._

Hilft das?

Alle 12 Kommentare

@amoenk Ja, wir benötigen Beispielcode, um Ihnen zu helfen.

Danke für Ihre Hilfe! Hier ist das Arbeitsbeispiel: http://notlouieagain.com/~amoenk/dnd/

Und dieser Link zum Durchsuchen des entbündelten Codes: http://notlouieagain.com/~amoenk/dnd/js/

Oh, ich habe beim Debuggen auch den ursprünglichen einfachen sortierbaren Democode eingefügt, aber die wichtigen Komponenten sind Ingredient und IngredientGroup.

Ich habe mir Ihren Code angesehen und kann die Komponente DnDStudy nicht finden. Können Sie mir Ihren vollständigen Code zeigen und nur Ihren. Sie können den Democode entfernen.

Democode entfernt, DnDStudy-Komponente ist hier eine Seitenkomponente: http://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js

Ok, ich habe nachgesehen und glaube, dass es ein Problem sein könnte, weil die Schlüssel IngredientGroup in DnDStudy . Anstatt sich auf den Index des Arrays zu verlassen, versuchen Sie es mit einer eindeutigen ID ähnlich der von Ingredient innerhalb von IngredientGroup .

Code aktualisiert, aber immer noch das gleiche Problem.

In Ordnung. Da lag ich falsch.

@gaearon kannst du helfen?

Damit isDragging im Komponentenbaum funktioniert, implementieren Sie bitte manuell isDragging in Ihrer Drag-Quelle.

const ingredientSource = {
    beginDrag(props) {
        return { ingredient: props.ingredient };
    },
    isDragging(props, monitor) {
        return props.ingredient === monitor.getItem().ingredient;
    }
};

Siehe DragSource Dokumente :

isDragging(props, monitor) : Optional. Standardmäßig wird nur die Ziehquelle, die den Ziehvorgang initiiert hat, als Ziehen betrachtet. Sie können dieses Verhalten überschreiben, indem Sie eine benutzerdefinierte isDragging Methode definieren. Es könnte etwas wie props.id === monitor.getItem().id . Tun Sie dies, wenn die Originalkomponente während des Ziehens ausgehängt und später mit einem anderen Elternteil „wiederbelebt“ wird. Wenn Sie beispielsweise eine Karte über die Listen in einem Kanban-Board verschieben, möchten Sie, dass sie das gezogene Erscheinungsbild behält – obwohl die Komponente technisch gesehen ausgehängt und jedes Mal eine andere angebracht wird, wenn Sie sie in eine andere Liste verschieben. _Hinweis: Sie dürfen monitor.isDragging() innerhalb dieser Methode nicht aufrufen._

Hilft das?

Funktioniert perfekt! Das muss in der Dokumentation übersehen worden sein.

Danke für deine Hilfe! Ich schließe das Ticket.

Kein Problem. Freue mich zu helfen.

meh! Links zu http://notlouieagain.com/ reagieren nicht ...

Ich habe die Ursache meines Problems gefunden. Ich musste aufhören, den DragDropContextProvider zu verwenden, um meine DropTargets und DragSources zu umschließen. Siehe das Beispiel unten.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context-provider.html

export default class YourApp {
    render() {
        return (
            <DragDropContextProvider backend={HTML5Backend}>
                /* ... */
            </DragDropContextProvider>
        )
    }
}

Stattdessen musste ich den DragDropContext verwenden, um meine gesamte Klasse wie unten beschrieben zu umschließen.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html

class YourApp {
    /* ... */
}
export default DragDropContext(HTML5Backend)(YourApp)

Das hat das Problem bei mir sofort behoben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen