这可能会在负责任和有见识之间走出一条界限,但是我将反复讨论如何随着复杂性的增加和使用某些方向来构建ReactJS组件。
来自AngularJS,我想将模型作为属性传递给组件,并让组件直接修改模型。还是应该将模型拆分为各种state
属性,并在向上游发送回时将其重新编译在一起?什么是ReactJS方式?
以博客文章编辑器为例。试图直接修改模型最终看起来像:
var PostEditor = React.createClass({
updateText: function(e) {
var text = e.target.value;
this.props.post.text = text;
this.forceUpdate();
},
render: function() {
return (
<input value={this.props.post.text} onChange={this.updateText}/>
<button onClick={this.props.post.save}/>Save</button>
);
}
});
好像错了
是否更像React的方式来制作我们的text
模型属性state
,并在保存之前将其编译回模型中:
var PostEditor = React.createClass({
getInitialState: function() {
return {
text: ""
};
},
componentWillMount: function() {
this.setState({
text: this.props.post.text
});
},
updateText: function(e) {
this.setState({
text: e.target.value
});
},
savePost: function() {
this.props.post.text = this.state.text;
this.props.post.save();
},
render: function() {
return (
<input value={this.state.text} onChange={this.updateText}/>
<button onClick={this.savePost}/>Save</button>
);
}
});
不需要调用this.forceUpdate()
,但是随着模型的增长,(帖子可能会有作者,主题,标签,评论,评分等),该组件开始变得非常复杂。
text
我们有一个setText
方法而不是字段,它可以进行验证和其他一些工作。我可以看到方法(2)setText
是纯函数,并且返回模型的全新实例。但是,如果setText
仅更新内部状态,我们仍然需要调用forceUpdate
,对吗?