React-dnd: 在相同的组件上使用 DragSource 和 DropTarget 但 DropTarget 没有响应

创建于 2018-04-12  ·  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 没关系,之后才意识到我忘记在渲染上调用 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 等级