これは、回答可能と独断の境界線をたどっているかもしれませんが、複雑さが増し、何らかの方向性を使用する可能性がある場合に、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>
);
}
});
それは間違っているようです。
次のように保存する前に、モデルtext
プロパティstate
を作成し、モデルにコンパイルするためのReactの方法ですか?
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()
、モデルが大きくなると(投稿に作成者、件名、タグ、コメント、評価などが含まれる場合があります)、コンポーネントは非常に複雑になり始めます。
ReactLinkでの最初の方法は行く方法ですか?
text
フィールドの代わりに、setText
検証などを行うメソッドがあるとします。メソッド(2)setText
が純粋で、モデルの新しいインスタンスを返す場合に機能することがわかります。ただし、setText
内部状態を更新するだけの場合はforceUpdate
、を呼び出す必要がありますよね?