React-dnd: Verwenden von DragSource und DropTarget für dieselben Komponenten, aber keine Antwort von DropTarget

Erstellt am 12. Apr. 2018  ·  3Kommentare  ·  Quelle: react-dnd/react-dnd

Es tut mir leid, dass ich dies möglicherweise eher als Hilfeforum verwende, aber trotz großer Bemühungen kann ich in diesem Anwendungsfall keine Antwort vom DropTarget erhalten.

Ich möchte eine Reihe von "Kategoriekarten" verwenden, die Drop-Ereignisse auf sich selbst registrieren können.

Mache ich hier irgendwelche eklatanten Fehler?

Ich kann bestätigen, dass die DragSource-Funktionen funktionieren, aber nichts, was ich von den DropTarget-Spezifikationsfunktionen protokolliere, schafft es auf die Konsole, es ist, als würden sie überhaupt nicht angewendet.

import React, { Component } from 'react'
import { DropTarget, DragSource } from 'react-dnd'
import _ from 'lodash'

export const ItemTypes = {
    CATEGORY: 'category-item'
}

class CategoryTreeFork extends Component {

    componentWillReceiveProps = (nextProps) => {
        console.log("Next cat props", nextProps)
    }

    render(){
        var { thisCat, childCat, level, dropEvent } = this.props
        const { connectDragSource, connectDropTarget, isDragging, isOver } = this.props

        return connectDragSource(
            <div className="category-tree-fork">
                <div className={`category-list-item level-${level}`}
                    style={{
                        opacity: isDragging ? 0.5 : 1,
                        backgroundColor: isOver ? "red" : "silver"
                    }}>
                    {thisCat.name}
                </div>
            </div>
        )   
    }   
}

/* get dragged */
const sourceSpec = { 
    beginDrag(props){
        return { category_id: props.thisCat.category_id }
    }   
}

const sourceCollect  = (connect, monitor) => {
    return {
        connectDragSource: connect.dragSource(),
        isDragging: monitor.isDragging()
    }
}


/* get dragged onto */
const targetSpec  = {
    drop(props, monitor, component) {
        const item = monitor.getItem()
        console.log("me or my friend?", item)
    },
    hover(props, monitor, component){
        console.log("yo what you hoverin there for homie?")
    }
}

const targetCollect = (connect, monitor) => {
    return {
        connectDropTarget: connect.dropTarget(),
        isOver: monitor.isOver()
    }
}


export default _.flow([
    DragSource(ItemTypes.CATEGORY, sourceSpec, sourceCollect),
    DropTarget(ItemTypes.CATEGORY, targetSpec, targetCollect)
])(CategoryTreeFork)

Hilfreichster Kommentar

Für Leute, die von einer Suchmaschine kommen und nach einer Möglichkeit suchen, DragSource und DropTarget auf derselben Komponente zu verwenden, ohne _.flow zu verwenden, gehen Sie wie folgt vor:

export default
    DragSource(typeA, specA, collectA)(
        DropTarget(typeB, specB, collectB)(
            Component));

Alle 3 Kommentare

DX vergiss es, gleich danach wurde mir klar, dass ich vergessen hatte, connectDropTarget beim Rendern aufzurufen. Das ist die Lösung:

 return connectDropTarget(connectDragSource(
            <div className="category-tree-fork">
                <div className={`category-list-item level-${level}`}
                    style={{
                        opacity: isDragging ? 0.5 : 1,
                        backgroundColor: isOver ? "red" : "silver"
                    }}>
                    {thisCat.name}
                </div>
            </div>

Das hat meine Probleme gerade gelöst. Folgte dem "einfachen", sortierbaren Beispiel und führte die doppelten Dekorateure aus, wandte aber nicht die connectDropTarget an

Für Leute, die von einer Suchmaschine kommen und nach einer Möglichkeit suchen, DragSource und DropTarget auf derselben Komponente zu verwenden, ohne _.flow zu verwenden, gehen Sie wie folgt vor:

export default
    DragSource(typeA, specA, collectA)(
        DropTarget(typeB, specB, collectB)(
            Component));
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen