Ini mungkin menginjak garis antara menjawab dan beropini, tapi saya akan bolak-balik tentang bagaimana menyusun komponen ReactJS saat kompleksitas tumbuh dan dapat menggunakan beberapa arah.
Berasal dari AngularJS, saya ingin meneruskan model saya ke komponen sebagai properti dan meminta komponen memodifikasi model secara langsung. Atau haruskah saya memisahkan model menjadi berbagai stateproperti dan mengumpulkannya kembali saat mengirim kembali ke hulu? Apa cara ReactJS?
Ambil contoh editor posting blog. Mencoba memodifikasi model secara langsung berakhir seperti:
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>
);
}
});
Yang sepertinya salah.
Apakah ini lebih merupakan cara React untuk membuat textproperti model kita state, dan mengkompilasinya kembali ke dalam model sebelum menyimpan seperti:
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>
);
}
});
Ini tidak memerlukan panggilan ke this.forceUpdate() , tetapi seiring berkembangnya model, (sebuah posting mungkin memiliki penulis, subjek, tag, komentar, peringkat, dll ...) komponen mulai menjadi sangat rumit.
Apakah metode pertama dengan ReactLink cara yang tepat?

textbidang, kita memilikisetTextmetode yang melakukan validasi dan beberapa hal lainnya. Saya dapat melihat metode (2) berfungsi jikasetTextmurni dan mengembalikan contoh model baru. Namun, jikasetTexthanya memperbarui keadaan batin kita masih perlu meneleponforceUpdate, bukan?