Saya kadang-kadang bereaksi komponen yang secara konseptual stateful yang ingin saya setel ulang. Perilaku ideal akan sama dengan menghapus komponen lama dan membaca komponen baru yang asli.
React menyediakan metode setState
yang memungkinkan pengaturan status eksplisit komponen, tetapi tidak termasuk status implisit seperti fokus browser dan status formulir, dan juga mengecualikan status turunannya. Menangkap semua keadaan tidak langsung itu bisa menjadi tugas yang rumit, dan saya lebih suka menyelesaikannya dengan teliti dan menyeluruh daripada bermain-main dengan setiap bagian baru yang mengejutkan.
Apakah ada API atau pola untuk melakukan ini?
Sunting: Saya membuat contoh sepele yang mendemonstrasikan this.replaceState(this.getInitialState())
pendekatan dan membandingkannya dengan this.setState(this.getInitialState())
pendekatan: jsfiddle - replaceState
lebih kuat.
key
dalam kasus ini.)replaceState()
dangetInitialState()
keduanya tidak digunakan lagi dalam reactjs gaya kelas ES6 yang baru. Gunakanthis.setState(this._getInitialState())
sebagai gantinya. Anda juga tidak dapat menamai fungsi penginisialisasi status Anda sendirigetInitialState()
- react melempar peringatan - menyebutnya hal lain dan secara eksplisit dilakukanstate = this._getInitialState()
di tingkat atas kelas.Anda harus benar-benar menghindari
replaceState
dan menggunakansetState
sebagai gantinya.Dokumen mengatakan bahwa
replaceState
"mungkin dihapus seluruhnya dalam versi React yang akan datang." Saya pikir itu pasti akan dihapus karenareplaceState
tidak benar-benar sesuai dengan filosofi React. Ini memfasilitasi pembuatan komponen React mulai terasa seperti pisau swiss-y. Ini menghalangi pertumbuhan alami komponen React yang menjadi lebih kecil, dan lebih dibuat khusus.Di React, jika Anda harus melakukan kesalahan pada generalisasi atau spesialisasi: bidiklah spesialisasi. Sebagai akibatnya, pohon status untuk komponen Anda harus memiliki kesederhanaan tertentu (tidak masalah untuk melanggar aturan ini dengan selera tinggi jika Anda merancang produk baru yang sangat bagus).
Bagaimanapun ini adalah bagaimana Anda melakukannya. Mirip dengan jawaban Ben (diterima) di atas, tetapi seperti ini:
this.setState(this.getInitialState());
Juga (seperti yang dikatakan Ben) untuk mengatur ulang "status browser" Anda perlu menghapus simpul DOM itu. Manfaatkan kekuatan vdom dan gunakan
key
prop baru untuk komponen itu. Render baru akan menggantikan grosir komponen itu.Referensi: https://facebook.github.io/react/docs/component-api.html#replacestate
sumber
this.replaceState
? Karena itu.getInitialState()
(misalnya, dalam handler onClick). Dalam hal ini, properti baru tersebut akan tetap ada setelah tanggal 2getInitialState()
.getInitialState
. Mirip seperti mendeklarasikan semua variabel Anda dalam Fungsi JS di bagian atas fungsi. Catatan tambahan: Solusi Ben Alpert hampir sama dengan solusi saya ... dan dia adalah pengelola React resmi!Menambahkan
key
atribut ke elemen yang Anda perlukan untuk menginisialisasi ulang, akan memuatnya kembali setiap kaliprops
ataustate
terkait dengan perubahan elemen.Berikut ini contohnya:
render() { const items = (this.props.resources) || []; const totalNumberOfItems = (this.props.resources.noOfItems) || 0; return ( <div className="items-container"> <PaginationContainer key={new Date().getTime()} totalNumberOfItems={totalNumberOfItems} items={items} onPageChange={this.onPageChange} /> </div> ); }
sumber