Mengapa dalam contoh pseudo-code berikut, Child tidak merender ulang ketika Container berubah foo.bar?
Container {
handleEvent() {
this.props.foo.bar = 123
},
render() {
return <Child bar={this.props.foo.bar} />
}
Child {
render() {
return <div>{this.props.bar}</div>
}
}
Bahkan jika saya menelepon forceUpdate()
setelah mengubah nilai dalam Container, Child masih menunjukkan nilai lama.
javascript
html
reactjs
Tuomas Toivonen
sumber
sumber
<Route exact path="/user/:email" component={ListUserMessagePage} />
, tautan pada halaman yang sama akan memperbarui alat peraga tanpa membuat instance baru dan menjalankan peristiwa siklus hidup yang biasa.Jawaban:
Perbarui anak untuk memiliki atribut 'kunci' sama dengan nama. Komponen akan merender ulang setiap kali kunci berubah.
sumber
[props.notRenderingArr, props.dummy]
. Jika panjang array selalu berubah, Anda bisa mengatur array dependensi useEffect[props.notRenderingArr.length]
.key
harus, vs adilsetState
? Saya punya beberapa anak yang mengandalkan keadaan orang tua tetapi mereka tidak memicu re-render ...Karena anak-anak tidak rerender jika alat peraga orang tua berubah, tetapi jika NEGARA nya berubah :)
Apa yang Anda perlihatkan adalah ini: https://facebook.github.io/react/tips/communicate-between-components.html
Ini akan meneruskan data dari orangtua ke anak melalui alat peraga tetapi tidak ada logika rerender di sana.
Anda perlu mengatur beberapa status ke orangtua lalu rerender anak pada status perubahan orangtua. Ini bisa membantu. https://facebook.github.io/react/tips/expose-component-functions.html
sumber
Saya memiliki masalah yang sama. Ini solusi saya, saya tidak yakin itu adalah praktik yang baik, beri tahu saya jika tidak:
UPD: Sekarang Anda dapat melakukan hal yang sama menggunakan React Hooks: (hanya jika komponen berfungsi)
sumber
componentDidUpdate
dalam hal ini masuk dalam komponen Anak.FunctionComponents
dalamnya akan secara otomatis memperbarui komponen anak jika alat peraga berubah.Menurut komponen filosofi React tidak dapat mengubah alat peraga. mereka harus diterima dari orang tua dan harus tidak berubah. Hanya orang tua yang dapat mengubah properti anak-anaknya.
penjelasan bagus tentang negara vs alat peraga
juga, baca utas ini. Mengapa saya tidak dapat memperbarui alat peraga di react.js?
sumber
Anda harus menggunakan
setState
fungsi. Jika tidak, nyatakan tidak akan menyimpan perubahan Anda, tidak peduli bagaimana Anda menggunakan forceUpdate.Kode Anda sepertinya tidak valid. Saya tidak dapat menguji kode ini.
sumber
<Child bar={this.state.foo.bar} />
?Saat membuat komponen Bereaksi dari
functions
danuseState
.Ini tidak bekerja
Ini bekerja (menambahkan kunci)
sumber
Dikonfirmasi, menambahkan Kunci berfungsi. Saya membaca dokumen untuk mencoba dan memahami mengapa.
Bereaksi ingin menjadi efisien ketika membuat komponen anak. Itu tidak akan membuat komponen baru jika itu sama dengan anak lain, yang membuat halaman memuat lebih cepat.
Menambahkan kekuatan kunci Bereaksi untuk membuat komponen baru, sehingga mengatur ulang status untuk komponen baru itu.
https://reactjs.org/docs/reconciliation.html#recursing-on-children
sumber
Gunakan fungsi setState. Jadi kamu bisa melakukannya
di dalam metode pegangan acara.
Setelah, negara diperbarui, itu akan memicu perubahan, dan render ulang akan terjadi.
sumber
Anda mungkin harus menjadikan Anak sebagai komponen fungsional jika tidak mempertahankan status apa pun dan cukup membuat alat peraga lalu memanggilnya dari induknya. Alternatif untuk ini adalah bahwa Anda dapat menggunakan kait dengan komponen fungsional (useState) yang akan menyebabkan komponen stateless kembali di-render.
Anda juga sebaiknya tidak mengubah propa karena tidak dapat diubah. Pertahankan status komponen.
sumber
Saya mengalami masalah yang sama. Saya memiliki
Tooltip
komponen yang menerimashowTooltip
prop, bahwa saya memperbarui padaParent
komponen berdasarkan suatuif
kondisi,Parent
komponen itu semakin diperbarui tetapiTooltip
komponen tidak merender.Kesalahan yang saya lakukan adalah menyatakan
showTooltip
sebagai let.Saya menyadari apa yang saya lakukan salah saya melanggar prinsip-prinsip bagaimana rendering bekerja, Menggantinya dengan kait melakukan pekerjaan.
sumber
mendefinisikan alat peraga yang diubah di mapStateToProps metode koneksi dalam komponen anak.
Dalam kasus saya, saluran channelList diperbarui jadi saya menambahkan chanelList di mapStateToProps
sumber
contoh ini digunakan
useEffect
untuk mengubah status saatprops
perubahan.sumber