【问题标题】:copy the node while drag and drop using react-flow-renderer使用 react-flow-renderer 拖放时复制节点
【发布时间】:2020-11-26 09:11:21
【问题描述】:

我正在尝试实现: 原始节点应保持在其位置并对其进行拖放,必须在放置位置创建一个新节点。原件应保持在初始位置。

拖动重复节点应该只是改变它的位置。

import React, { Component, MouseEvent } from 'react'
import ReactFlow from 'react-flow-renderer'

export default class Platform extends Component {

    constructor(props) {
        super(props)
        
    
        this.state = {
             duplicates : [],
             original: [{id: "original", data: {label: 'original', duplicate: false }, position: {x:100, y:100}, style: this.style}]
        }
    }

    lastId = 0
    style = { background: '#ccc', width: 50, height: 50, borderRadius: 50}


    onNodeDragStart = (evt: MouseEvent, node: Node) => {
    }


    onNodeDragStop = (evt: MouseEvent, node: Node) => {
        if(!node.data.duplicate){
            node.id = (this.lastId++).toString(10)
            node.data.duplicate = true
            node.data.label = "duplicate"
            
            this.setState(prevState => ({
                duplicates: prevState.duplicates.concat(node)
            }))
        }
    }

    
    render() {
        console.log("state: ", this.state)
        const elements = this.state.original.concat(this.state.duplicates)
        const graphStyles = { width: '100%', height: '800px' };

        return (
            <div>
                <ReactFlow  onNodeDragStart={this.onNodeDragStart} onNodeDragStop={this.onNodeDragStop}  style={graphStyles} elements={elements}></ReactFlow>
            </div>
        )
    }
}

原始节点

拖放后在放置位置创建一个重复节点。 当我看到组件的状态时,它仍然显示原始位置为position:{x:100, y:100}。但它不在那个位置。

如何在创建重复节点时使原始完整?

【问题讨论】:

    标签: javascript reactjs drag-and-drop html5-canvas react-class-based-component


    【解决方案1】:

    您必须添加将更新状态中的位置的代码。默认情况下,此位置仅在创建新元素时使用,但不会更新。您可以通过将 onNodeDragStop 处理程序更改为以下内容来解决此问题:

    onNodeDragStop = (evt: MouseEvent, node: Node) => {
        if (!node.data.duplicate) {
            this.setState(prevState => ({
                original: prevState.original.map((n) => {
                    if (n.id !== node.id) return node;
    
                    return {
                        ...node,
                        position: {
                            x: node.position.x,
                            y: node.position.y
                        }
                    }
                }),
                duplicates: [
                    ...prevState.duplicates,
                    {
                        ...node,
                        id: (this.lastId++).toString(10),
                        data: {
                            ...node.data,
                            duplicate: true,
                            label: "duplicate"
                        },
                    }
                ]
            }))
        }
    }
    

    另外,我将您的代码更改为不改变原始节点,而是返回一个更改了一些属性的新节点。

    【讨论】:

    • 你是对的!我没有意识到你有不同阵列的原件。我更正了我的答案。
    • 你执行过这段代码吗?因为它仍然不适合我。对不起。
    • 不,因为我没有你的完整代码。你能告诉我它有什么问题吗?或者你可以在codesandbox.io上创建sn-p@
    • 这就是整个代码。我只写了一个组件。 codesandbox.io/s/elastic-wood-6kqvm?file=/src/index.js
    • 有几个问题,首先,项目在依赖方面存在一些问题,但是当我将react-flow-renderer 的版本降级为5.1.0 时,它可以工作。但这只是一个沙盒问题。接下来,App.js 中有无效的 JSX,你必须关闭&lt;Platform&gt; 标签。同样在 Platform.js 中,您正在使用 typescript 类型 (evt: MouseEvent, node: Node) 作为函数参数,但这是在 javascript 文件中。最后,我只是将我的代码(没有打字稿类型)复制到您的示例中,并且它可以正常工作。这是工作示例codesandbox.io/s/eager-voice-3le8o
    猜你喜欢
    • 2020-11-04
    • 2022-09-29
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多