React-dnd: استخدام DragSource و DropTarget على نفس المكونات ولكن لا توجد استجابة من DropTarget

تم إنشاؤها على ١٢ أبريل ٢٠١٨  ·  3تعليقات  ·  مصدر: react-dnd/react-dnd

نأسف لاستخدام هذا كمنتدى مساعدة ، ولكن على الرغم من الجهود الكبيرة ، لا يمكنني الحصول على أي رد من DropTarget في حالة الاستخدام هذه.

أرغب في استخدام سلسلة من "بطاقات الفئات" التي يمكنها تسجيل أحداث الإسقاط على نفسها.

هل أقوم بأي أخطاء فادحة هنا؟

يمكنني أن أؤكد أن وظائف DragSource تعمل ، ولكن لا شيء يمكنني تسجيله من وظائف مواصفات DropTarget يجعله يصل إلى وحدة التحكم ، يبدو الأمر كما لو لم يتم تطبيقها تمامًا.

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)

التعليق الأكثر فائدة

للأشخاص القادمين من محرك بحث ، يبحثون عن طريقة لاستخدام DragSource و DropTarget على نفس المكون دون استخدام _.flow ، هكذا تفعل ذلك:

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

ال 3 كومينتر

DX nevermind ، أدركت بعد ذلك مباشرة أنني نسيت استدعاء connectDropTarget على العرض. هذا هو الإصلاح:

 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>

هذا حل مشاكلي الآن. اتبعت المثال "البسيط" القابل للفرز وعمل الزخرفة المزدوجة ، لكن لم تطبق connectDropTarget

للأشخاص القادمين من محرك بحث ، يبحثون عن طريقة لاستخدام DragSource و DropTarget على نفس المكون دون استخدام _.flow ، هكذا تفعل ذلك:

export default
    DragSource(typeA, specA, collectA)(
        DropTarget(typeB, specB, collectB)(
            Component));
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات