componentWillReceiveProps
已过时,但是,如何迁移它尚不清楚。例如,我当前版本的简化版本如下所示:
import Reorder, {reorder, reorderImmutale, reorderFromTo, reorderFromToImmutable} from 'react-reorder'
class ObjectsArea extends React.Component {
constructor(props) {
super(props);
this.state = {
items: this.props.objects ? this.props.objects.items : []
};
}
componentWillReceiveProps(nextProps){
//May have to do a deep compare between nextProps.items and current items?
if (nextProps.objects){
this.setState({items: this.nextProps.objects.items})
}
}
onReorder (event, previousIndex, nextIndex, fromId, toId) {
let new_items = reorder(this.state.items, previousIndex, nextIndex)
this.setState({
items: new_items
});
//call to parent function
}
render(){
orderable_items = <Reorder reorderId="objects" onReorder={this.onReorder.bind(this)}>
{
this.state.items.map(item => (
<div key={item.id}>
{item.text}
</div>
))
}
</Reorder>
return (
<div>{orderable_items}</div>
)
}
我的要求:
react-reorder
组件创建可排序/可拖动的列表onReorder
函数。当前所有这些都可以与componentWillReceiveProps一起使用,但是,根据上述要求,从componentWillReceiveProps迁移出来的正确方法是什么?
答案 0 :(得分:1)
在遇到问题时可以解决。
static getDerivedStateFromProps(nextProps, prevState){
if (nextProps.objects){){
return {items: this.nextProps.objects.items};
}
else return null;
}
请按照this post进行谅解
答案 1 :(得分:1)
尽管Tolsee的答案是完全正确的,但也值得一提的是react文档建议完全删除(基于道具计算的状态)。我认为a great article here是一本好书。
您的示例非常适合Anti-pattern: Unconditionally copying props to state示例。
在不知道您的环境的情况下,我当然不能推荐解决方案,但对我来说,您似乎可以使用Fully controlled component示例。
在这种情况下,您需要lift your state up,只需使用objects.items
来渲染您的Reorder
子级,并且在onReorder
事件期间,只需调用一个您作为道具被接收。