Lebih
Memperbarui sebuah objek dengan setState dalam Bereaksi
Itu adalah mungkin untuk memperbarui objek's properties dengan setState?
Sesuatu seperti:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Saya telah mencoba:
this.setState({jasper.name: 'someOtherName'});
dan ini:
this.setState({jasper: {name: 'someothername'}})
Hasil pertama dalam kesalahan sintaks dan kedua hanya tidak apa-apa. Ada ide?
211
14
Ada beberapa cara untuk melakukan hal ini, karena negara update operasi asinkron, jadi untuk memperbarui keadaan objek, kita perlu menggunakan fungsi updater dengan
setState
.1 - Sederhana satu:
Pertama membuat copy dari
jasper
kemudian melakukan perubahan dalam:Alih-alih menggunakan
Objek.menetapkan
kita bisa juga menulis seperti ini:2 - Menggunakan [menyebar operator]3:
Catatan:
Objek.menetapkan
danMenyebar Operator
hanya menciptakan dangkal salin, jadi jika anda memiliki didefinisikan nested object atau array dari objek, anda membutuhkan pendekatan yang berbeda.Memperbarui bersarang keadaan objek:
Asumsikan anda memiliki negara didefinisikan sebagai:
Untuk update extraCheese pizza objek:
Memperbarui array dari objek:
Mari kita asumsikan anda memiliki sebuah aplikasi todo, dan anda mengelola data-data di formulir ini:
Untuk update status setiap todo objek, menjalankan sebuah peta pada array dan memeriksa beberapa nilai yang unik dari setiap objek, dalam kasus
kondisi=true
, kembali objek baru dengan diperbarui nilai, yang lain objek yang sama.Saran: Jika obyek doesn't memiliki nilai yang unik, maka digunakan indeks array.
Ini adalah cara tercepat dan paling dapat dibaca dengan cara:
Bahkan jika
ini.negara.jasper
sudah berisi nama tamu, nama barunama: 'someothername'
dengan yang akan digunakan.Gunakan menyebar operator dan beberapa ES6 di sini
Saya menggunakan solusi ini.
Jika anda memiliki bersarang negara seperti ini:
ini.negara = { formInputs:{ friendName:{ nilai:'', isValid:false, errorMsg:'' }, friendEmail:{ nilai:'', isValid:false, errorMsg:'' } } }
anda dapat mendeklarasikan handleChange fungsi yang salin status dan kembali memberikan itu dengan mengubah nilai-nilaidi sini html dengan acara pendengar. Pastikan untuk menggunakan nama yang sama digunakan dalam keadaan objek (dalam hal ini 'friendName')
mencoba ini,itu harus bekerja dengan baik
Kasus pertama adalah memang sebuah kesalahan sintaks.
Karena saya dapat't melihat sisa komponen,'s sulit untuk melihat mengapa anda're bersarang benda-benda dalam negara anda di sini. It's bukan ide yang baik untuk sarang objek dalam komponen negara. Mencoba menetapkan keadaan awal menjadi:
Dengan cara itu, jika anda ingin update nama, anda hanya dapat menghubungi:
Itu akan mencapai apa yang anda're bertujuan untuk?
Untuk yang lebih besar, lebih kompleks data toko, saya akan menggunakan sesuatu seperti Redux. Tapi yang's jauh lebih maju.
Aturan umum dengan komponen negara adalah untuk menggunakannya hanya untuk mengelola UI keadaan komponen (misalnya aktif, timer, dll.)
Memeriksa referensi ini:
Pilihan lain: menentukan variabel dari Jasper objek dan kemudian hanya memanggil variabel.
Menyebar operator: ES6
Saya tahu ada banyak jawaban di sini, tapi saya'm terkejut tidak satupun dari mereka membuat salinan objek baru di luar setState, dan kemudian hanya setState({newObject}). Bersih, ringkas dan dapat diandalkan. Jadi dalam hal ini:
Atau untuk properti dinamis (sangat berguna untuk bentuk-bentuk)
const jasper = { ...ini.negara.jasper, [VarRepresentingPropertyName]: 'nilai baru' } ini.setState(prevState => ({ jasper }))
Anda dapat mencoba dengan ini:
atau untuk properti lainnya:
Atau anda dapat menggunakan handleChage fungsi:
dan kode HTML:
Anda dapat mencoba dengan ini: (Catatan: nama masukan tag === bidang objek) `` <input name="myField" type="text" nilai={ini.negara.myObject.myField} onChange={ini.handleChangeInpForm}>
< input>handleChangeInpForm = (e) => { mari newObject = ini.negara.myObject; newObject[e.target.name] = e.target.nilai; ini.setState({ myObject: newObject }) } ``
Sederhana dan cara dinamis.
Ini akan melakukan pekerjaan, tetapi anda perlu untuk mengatur semua id ke orang tua sehingga orang tua akan mengarah ke nama objek, menjadi id = "jasper" dan nama-nama elemen input = properti di dalam objek jasper.
Tanpa menggunakan Async dan Menanti Menggunakan ini...
Jika anda menggunakan dengan Async Dan Menanti menggunakan ini...
Juga, berikut Alberto Piras solusi, jika anda don't ingin menyalin semua "negara" obyek:
ini adalah solusi lain menggunakan immer immutabe utilitas, sangat cocok untuk sangat bersarang benda dengan mudah, dan anda tidak harus peduli tentang mutasi