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?forceUpdate
, tetapi pada saat itu Anda "bocor" dari React. Mungkin lebih baik meneruskansetState()
callback ke model buram untuk menghindari keharusan memicu rendering ulang secara manual.Memperbarui 2016: React diubah, dan penjelasan "props vs state" menjadi sangat sederhana. Jika sebuah komponen perlu mengubah data - taruh dalam keadaan, jika tidak di props. Karena alat peraga sekarang hanya bisa dibaca .
Apa perbedaan yang tepat antara props dan state?
Anda dapat menemukan penjelasan yang bagus di sini (versi lengkap)
sumber
setProps
sudah usang dan tidak boleh digunakan. Penggantian adalah untuk merender ulang komponen dan membiarkan React menangani perbedaannya.Dari React doc
Dari TrySpace : saat props (atau status) diperbarui (melalui setProps / setState atau induk) komponen juga akan dirender ulang.
sumber
Bacaan dari Thinking in React :
sumber
Saya tidak yakin apakah saya menjawab pertanyaan Anda, tetapi saya telah menemukan bahwa, terutama dalam aplikasi besar / berkembang, pola Kontainer / Komponen bekerja dengan sangat baik.
Pada dasarnya Anda memiliki dua komponen React:
Contoh
NB Contoh ini mungkin terlalu sederhana untuk menggambarkan manfaat dari pola ini, karena cukup bertele-tele untuk kasus yang begitu sederhana.
Manfaat
Dengan memisahkan logika tampilan dan manajemen data / status, Anda memiliki komponen tampilan yang dapat digunakan kembali yang:
Anda juga memiliki komponen kontainer yang menangani semua komunikasi eksternal. Ini akan memudahkan Anda untuk bersikap fleksibel tentang cara Anda mengakses data jika Anda membuat perubahan serius di lain waktu *.
Pola ini juga membuat penulisan dan penerapan pengujian unit jauh lebih mudah.
Setelah mengulangi aplikasi React yang besar beberapa kali, saya menemukan bahwa pola ini membuat semuanya relatif tidak menyakitkan, terutama ketika Anda memiliki komponen yang lebih besar dengan gaya terhitung atau interaksi DOM yang rumit.
* Bacalah pola fluks, dan lihat
Marty.js , yang sebagian besar menginspirasi jawaban ini (dan saya telah banyak menggunakan akhir-akhir ini)Redux (dan react-redux ), yang menerapkan pola ini dengan sangat baik.sumber
Saya pikir Anda menggunakan anti-pola yang telah dijelaskan Facebook di tautan ini
Inilah hal yang Anda temukan:
Pertama kali komponen dalam dirender, ini akan memiliki {foo: 'bar'} sebagai prop nilai. Jika pengguna mengklik jangkar, status komponen induk akan diperbarui menjadi {value: {foo: 'barbar'}}, memicu proses rendering ulang komponen dalam, yang akan menerima {foo: 'barbar'} sebagai nilai baru untuk prop.
Masalahnya adalah karena induk dan komponen dalam berbagi referensi ke objek yang sama, ketika objek dimutasi pada baris 2 dari fungsi onClick, prop yang dimiliki komponen dalam akan berubah. Jadi, ketika proses rendering ulang dimulai, dan shouldComponentUpdate dipanggil, this.props.value.foo akan sama dengan nextProps.value.foo, karena sebenarnya, this.props.value mereferensikan objek yang sama dengan nextProps.value.
Akibatnya, karena kita akan melewatkan perubahan pada prop dan sirkuit pendek proses rendering ulang, UI tidak akan diperbarui dari 'bar' ke 'barbar'
sumber
Innercomponents
kode?