【问题标题】:How do I duplicate a component while preserving state?如何在保留状态的同时复制组件?
【发布时间】:2018-11-08 12:27:04
【问题描述】:

我有一个带有state 的组件,由于一些异步操作而得到更新。这个组件是一些拖放 UI 的一部分,当用户开始拖动操作时,我需要在应用程序的一个单独部分中呈现这个组件,该部分负责显示拖动的元素。

问题是,如果我在其他地方重新渲染组件,即使我传递了相同的道具,它仍然必须运行异步操作,然后才能从与拖动源相同的状态渲染组件。

我认为我可以通过执行以下操作来使其工作 - 引用拖动源的组件的渲染方法:

render() {
    return (
        <DragSourceComponent ref={this.dragSourceComponentRef} />
    )
}

以及负责渲染拖拽预览组件的不同组件渲染方法:

renderDragPreview(dragSourceComponentRef) {
    return React.cloneElement(dragSourceComponentRef.current)
}

但这不起作用,因为dragSourceComponentRef.current 不被视为有效的 React 元素,即使它是,我也不认为 React.cloneElement 复制组件的状态(文档对此并不明确)。

考虑到所有这些,我还有哪些其他选择? 是否可以说,在第一次渲染之前预先设置组件的状态?如果是这种情况,我可能能够使用相同的道具和克隆状态渲染拖​​动预览组件,并让它看起来与拖动源元素完全相同。任何其他想法/建议表示赞赏!

【问题讨论】:

  • 你只需要状态来创建一个克隆。您可以使用 contextApi 来共享状态或 redux。

标签: javascript reactjs react-dnd


【解决方案1】:

您只需要与多个相似的组件共享一个状态,而不是将兄弟组件的状态复制到复制的那个。 您有两种选择:

  1. 将 DragSourceComponent 的状态移至其父组件并通过 props 获取;
  2. 将 DragSourceComponent 的状态移动到上下文中,并通过 React.useContext() 钩子在任何你想要的地方获取它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 2019-07-28
    • 2020-10-07
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多