我正在尝试使用React DnD在React中实现可排序列表的可排序列表。在实现事物的拖放方面之前,一切都很好。
我有一个容器组件,它呈现了这一点:
<DndProvider backend={Backend}>
{this.state.classifications.map((classification,index) =>
<Classification id={classification.id} classification={classification} reportTemplate={this} key={classification.id} index={index} />
)}
</DndProvider>
分类扩展了组件,其构造如下:
constructor(props) {
super(props);
this.state = {
isEditing: false,classification: props.classification
};
}
...,并对此进行渲染(为了简洁起见):
<div classname="panel-body">
<DndProvider backend={Backend}>
{this.state.classification.labels.map((label,index) =>
<Label id={label.id} label={label} reportTemplate={this.props.reportTemplate} key={label.id} index={index} />
)}
</DndProvider>
</div>
依次,Label也扩展了组件,其结构如下:
constructor(props) {
super(props);
this.state = {
isEditing: false,label: props.label
};
}
...并进行如下渲染(为了简洁起见,也是如此):
return (
<div classname={"panel panel-default panel-label " + (isDragging ? "dragging " : "") + (isOver ? " over" : "")}>
<div classname="panel-heading" role="tab" id={"label-" + this.state.label.id}>
<div classname="panel-title">
<div classname="row">
<div classname="col-xs-6 label-details">
{this.state.isEditing
? <input type="text" classname="form-control" value={this.state.label.value} onChange={e => this.props.reportTemplate.onLabelValueChange(e,this.state.label.classificationId,this.state.label.id,'value')} />
: <p classname="form-control-static">{this.state.label.value}</p>
}
<div classname="subuser-container">...</div>
</div>
</div>
</div>
</div>
);
所有这些都很好-当用户从Label子组件中进行更改时,它在根组件中得到更新,并且所有内容都同步并刷新。
但是,当实现React DnD时,Classification和Label组件都被包装在Drag和Drop装饰器中,以提供排序。通过拖放进行排序非常有效。 但是:这已导致元素更新停止工作(即,当对Label进行更改时,更新会正确地传递到根Component,但不会刷新下来那个树)。
分类和标签dnd的实现在render方法中都是这样的:
return connectDropTarget(connectDragSource(...));
...以及导出组件时的提示:
export default DropTarget('classification',classificationTarget,classificationDropCollect)(DragSource('classification',classificationSource,classificationDragCollect)(Classification));
有趣的是,当标签被编辑后,当用户拖放组件时,刷新就会发生。因此,就像拖放一样,它会触发组件刷新,但不会触发其他onChange
函数。
这是一个很长的问题,很抱歉。我几乎可以肯定其他人也会遇到此问题,因此非常感谢任何指针。