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 state
properti 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 text
properti 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?
text
bidang, kita memilikisetText
metode yang melakukan validasi dan beberapa hal lainnya. Saya dapat melihat metode (2) berfungsi jikasetText
murni dan mengembalikan contoh model baru. Namun, jikasetText
hanya memperbarui keadaan batin kita masih perlu meneleponforceUpdate
, bukan?