React-dnd: Utilisation de DragSource et DropTarget sur les mêmes composants mais pas de réponse de DropTarget

Créé le 12 avr. 2018  ·  3Commentaires  ·  Source: react-dnd/react-dnd

Désolé de l'utiliser éventuellement comme un forum d'aide, mais malgré de grands efforts, je ne parviens pas à obtenir de réponse de DropTarget dans ce cas d'utilisation.

Je souhaite utiliser une série de "cartes de catégorie" qui peuvent enregistrer des événements de chute sur eux-mêmes.

Est-ce que je fais des conneries flagrantes ici ?

Je peux confirmer que les fonctions DragSource fonctionnent, mais rien de ce que j'enregistre à partir des fonctions de spécification DropTarget n'arrive à la console, c'est comme si elles n'étaient pas du tout appliquées.

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)

Commentaire le plus utile

pour les personnes venant d'un moteur de recherche, cherchant un moyen d'utiliser DragSource et DropTarget sur le même composant sans utiliser _.flow , voici comment procéder :

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

Tous les 3 commentaires

DX tant pis, j'ai réalisé juste après que j'avais oublié d'appeler connectDropTarget sur le rendu. C'est le correctif :

 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>

Cela a résolu mes problèmes tout à l'heure. A suivi l'exemple "simple", triable et a fait les doubles décorateurs, mais n'a pas appliqué le connectDropTarget

pour les personnes venant d'un moteur de recherche, cherchant un moyen d'utiliser DragSource et DropTarget sur le même composant sans utiliser _.flow , voici comment procéder :

export default
    DragSource(typeA, specA, collectA)(
        DropTarget(typeB, specB, collectB)(
            Component));
Cette page vous a été utile?
0 / 5 - 0 notes