Penolakan
Nested State in React adalah desain yang salah
Baca jawaban yang luar biasa ini .
Alasan di balik jawaban ini:
SetState React hanyalah kenyamanan bawaan, tetapi Anda segera menyadari bahwa ia memiliki batasnya. Menggunakan properti khusus dan penggunaan forceUpdate yang cerdas memberi Anda lebih banyak. misalnya:
class MyClass extends React.Component {
myState = someObject
inputValue = 42
...
MobX, misalnya, benar-benar parit dan menggunakan properti kustom yang dapat diamati.
Gunakan Observable sebagai ganti status dalam komponen Bereaksi.
Ada cara lain yang lebih singkat untuk memperbarui properti bersarang apa pun.
this.setState(state => {
state.nested.flag = false
state.another.deep.prop = true
return state
})
Pada satu baris
this.setState(state => (state.nested.flag = false, state))
catatan: Ini di sini adalah operator Koma ~ MDN , lihatlah dalam aksi di sini (Kotak Pasir) .
Ini mirip dengan (meskipun ini tidak mengubah referensi keadaan)
this.state.nested.flag = false
this.forceUpdate()
Untuk perbedaan halus dalam konteks ini antara forceUpdate
dan setState
lihat contoh terkait.
Tentu saja ini menyalahgunakan beberapa prinsip inti, karena state
seharusnya hanya-baca, tetapi karena Anda segera membuang negara lama dan menggantinya dengan negara baru, itu sepenuhnya ok.
Peringatan
Meskipun komponen yang berisi status akan diperbarui dan dirender ulang dengan benar ( kecuali gotcha ini ) , alat peraga akan gagal disebarkan ke anak-anak (lihat komentar Spymaster di bawah) . Gunakan teknik ini hanya jika Anda tahu apa yang Anda lakukan.
Misalnya, Anda dapat melewati prop datar yang diubah yang diperbarui dan dilewati dengan mudah.
render(
//some complex render with your nested state
<ChildComponent complexNestedProp={this.state.nested} pleaseRerender={Math.random()}/>
)
Sekarang meskipun referensi untuk complexNestedProp tidak berubah ( shouldComponentUpdate )
this.props.complexNestedProp === nextProps.complexNestedProp
komponen akan dirender ulang setiap kali pembaruan komponen induk, yang merupakan kasus setelah memanggil this.setState
atau this.forceUpdate
di induk.
Efek dari mutasi negara
Menggunakan negara bersarang dan bermutasi negara secara langsung berbahaya karena objek yang berbeda mungkin terus (sengaja atau tidak) yang berbeda referensi (tua) ke negara dan mungkin tidak selalu tahu kapan harus update (misalnya saat menggunakan PureComponent
atau jika shouldComponentUpdate
diimplementasikan untuk pulang false
) OR adalah dimaksudkan untuk menampilkan data lama seperti pada contoh di bawah ini.
Bayangkan sebuah timeline yang seharusnya membuat data historis, mengubah data di bawah tangan akan menghasilkan perilaku yang tidak terduga karena juga akan mengubah item sebelumnya.
Bagaimanapun di sini Anda dapat melihat bahwa Nested PureChildClass
itu tidak dirender karena alat peraga gagal untuk disebarkan.