【问题标题】:How can I change ID of copied element如何更改复制元素的 ID
【发布时间】:2019-06-24 15:39:26
【问题描述】:

我尝试使用 react-smooth-dnd 创建 dnd 编辑器。我有 2 个容器:第一个是带有元素的工具栏,第二个是编辑器。 每个元素具有以下结构:

{
 id: shortid.generate(),
 type: 'TextElement',
 options: {
    text: 'Text',
    style: {
       padding: '10px 0 10px 15px'
    },
    isShowToolBar: false
 }
}

当我尝试将元素从第一个容器复制到第二个容器时,我想更改当前元素的id,但是当我尝试使用onDrop 回调时,我只能更改每个元素的id两个容器。

如何仅更改 id 的当前元素?

我的第一个(工具栏)容器是:

<Container
  groupName="1"
  behaviour="copy"
  getChildPayload={i => this.state.items[i]}
>
  {
    this.state.items.map((element,i) => {
      const component = createComponent(element, TYPE_TOOLBAR);
      return (
        <Draggable
          key={i}
          style={{display: 'inline-block', padding: '10px'}}
          className="col-xl-4 col-lg-4 col-md-4 col-sm-12 col-12"
       >
         {component}
       </Draggable>
      );
    })
  }
</Container>

还有我的第二个容器(编辑器):

<Container
    groupName="1"
    getChildPayload={i => this.state.items[i]}
    onDrop={e => this.setState({
        items: applyDrag(this.state.items, e)
    })}
    lockAxis="y"
    dragHandleSelector=".element-drag-handler"
>
    {
        this.state.items.map((element, i) => {
            const component = createComponent(
                element,
                TYPE_EDITOR,
                this.elementToolBarHandler
            );

            return (
                <Draggable key={i}>
                    {component}
                </Draggable>
            );
        })
    }
</Container>

【问题讨论】:

    标签: javascript reactjs drag-and-drop


    【解决方案1】:

    我认为您正在寻找 fof 是 reactCloneElement 它允许您获取组件并更改他的道具。 小心使用这个函数,它会保持元素的引用被克隆。

    这是我对可能实现的尝试

    const applyDrag = e => {
    
     const {items} = this.state
     // you get your element
     const element = e. ???? 
    
     // Then you recreate it and changing his id 
     const item = React.cloneElement(
      element,
      {
       id: shortid.generate(),
       ...element.props,
      },
    )
    
     this.setState({items: items.length > 0 ? items.concat(item) : [].concat(item)})
    }
    
    <Container
        groupName="1"
        getChildPayload={i => this.state.items[i]}
        onDrop={this.applyDrag(e)}
        lockAxis="y"
        dragHandleSelector=".element-drag-handler"
    >
        {
            this.state.items.map((element, i) => {
                const component = createComponent(
                    element,
                    TYPE_EDITOR,
                    this.elementToolBarHandler
                );
    
                return (
                    <Draggable key={i}>
                        {component}
                    </Draggable>
                );
            })
        }
    

    【讨论】:

      【解决方案2】:

      好吧,我尝试了几种方法,如果您不想使用 reactCloneElement 克隆元素,您可以执行以下操作。

      在我的第一个容器(工具栏)中,我创建了一个 onDragStart 回调:

      onDragStart={e => this.onDragStart(e)}
      

      功能实现:

      updateId(element) {
          let index = this.state.items.findIndex(x => x.id === element.id);
          if (index === -1) index = 1;
          this.setState(update(this.state, {
              items: {
                  [index]: {
                      $merge: {
                          id: shortid.generate()
                      }
                  }
              }
          }));
      }
      
      onDragStart({payload}) {
          this.updateId(payload);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 2014-05-23
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        相关资源
        最近更新 更多