Apakah mungkin untuk memperbarui properti objek 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 yang kedua tidak melakukan apa-apa. Ada ide?
age
properti di dalamnyajasper
.Jawaban:
Ada beberapa cara untuk melakukan ini, karena pembaruan negara adalah operasi async , jadi untuk memperbarui objek keadaan, kita perlu menggunakan fungsi pembaru dengan
setState
.1- yang paling sederhana:
Pertama buat salinan
jasper
lalu lakukan perubahan itu:Alih-alih menggunakan
Object.assign
kami juga dapat menulis seperti ini:2- Menggunakan operator spread :
Catatan:
Object.assign
danSpread Operator
hanya membuat salinan dangkal , jadi jika Anda telah mendefinisikan objek bersarang atau array objek, Anda memerlukan pendekatan yang berbeda.Memperbarui objek keadaan tersarang:
Asumsikan Anda telah mendefinisikan status sebagai:
Untuk memperbarui objek pizza ekstraCheese:
Memperbarui berbagai objek:
Mari kita asumsikan Anda memiliki aplikasi todo, dan Anda mengelola data dalam formulir ini:
Untuk memperbarui status objek todo apa pun, jalankan peta pada larik dan periksa beberapa nilai unik dari setiap objek, jika ada
condition=true
, kembalikan objek baru dengan nilai yang diperbarui, atau objek yang sama.Saran: Jika objek tidak memiliki nilai unik, maka gunakan indeks array.
sumber
jasper
objek, apakahconsole.log(jasper)
Anda hanya akan melihat satu kunciname
, usia tidak akan ada :)jasper
merupakanobject
, jangan yang terbaik atau tidak, mungkin solusi lain yang lebih baik adalah mungkin :)Object.assign
operator yang juga menyalin properti yang dalam Dengan cara ini Anda harus menggunakan solusi seperti lodashdeepCopy
dll.let { jasper } = this.state
?Ini adalah cara tercepat dan paling mudah dibaca:
Bahkan jika
this.state.jasper
sudah mengandung properti nama, nama baruname: 'someothername'
dengan yang digunakan.sumber
this.state.jasper
tidak harus mengandung keadaan terbaru. Lebih baik gunakan notasi denganprevState
.Gunakan operator spread dan beberapa ES6 di sini
sumber
Saya menggunakan solusi ini.
Jika Anda memiliki status bersarang seperti ini:
Anda dapat mendeklarasikan fungsi handleChange yang menyalin status saat ini dan menetapkan kembali dengan nilai yang diubah
di sini html dengan pendengar acara. Pastikan untuk menggunakan nama yang sama yang digunakan untuk objek negara (dalam hal ini 'friendName')
sumber
statusCopy.formInputs[inputName] = inputValue;
Saya tahu ada banyak jawaban di sini, tapi saya terkejut tidak satupun dari mereka membuat salinan objek baru di luar setState, dan kemudian cukup setState ({newObject}). Bersih, ringkas, dan andal. Jadi dalam hal ini:
Atau untuk properti dinamis (sangat berguna untuk formulir)
sumber
coba ini, itu akan berfungsi dengan baik
sumber
Object.assign({}, this.state.jasper, {name:'someOtherName'})
Kasus pertama memang merupakan kesalahan sintaksis.
Karena saya tidak dapat melihat sisa komponen Anda, sulit untuk melihat mengapa Anda bersarang objek di negara Anda di sini. Itu bukan ide yang baik untuk bersarang objek dalam keadaan komponen. Coba atur status awal Anda menjadi:
Dengan begitu, jika Anda ingin memperbarui nama, Anda bisa menghubungi:
Apakah itu akan mencapai apa yang Anda tuju?
Untuk penyimpanan data yang lebih besar dan lebih kompleks, saya akan menggunakan sesuatu seperti Redux. Tapi itu jauh lebih maju.
Aturan umum dengan status komponen adalah menggunakannya hanya untuk mengelola keadaan UI komponen (misalnya aktif, timer, dll.)
Lihatlah referensi ini:
sumber
Pilihan lain: tentukan variabel Anda dari objek Jasper dan kemudian panggil variabel.
Operator penyebaran: ES6
sumber
Cara sederhana dan dinamis.
Ini akan melakukan pekerjaan, tetapi Anda harus mengatur semua id ke induk sehingga orang tua akan menunjuk ke nama objek, menjadi id = "jasper" dan nama nama elemen input = properti di dalam objek jasper .
sumber
Anda dapat mencoba ini : ( Catatan : nama tag input === bidang objek)
sumber
ini adalah solusi lain menggunakan utilitas imutabe immer , sangat cocok untuk objek bersarang dengan mudah, dan Anda tidak perlu peduli tentang mutasi
sumber
Juga, mengikuti solusi Alberto Piras, jika Anda tidak ingin menyalin semua objek "state":
sumber
Anda dapat mencoba ini:
atau untuk properti lainnya:
Atau Anda dapat menggunakan fungsi handleChage:
dan kode HTML:
sumber
Tanpa menggunakan Async dan Tunggu ...
Jika Anda menggunakan dengan Async Dan Tunggu gunakan ini ...
sumber
Pengaturan ini berhasil bagi saya:
sumber