Saya ingin menambahkan elemen ke akhir a state
array, apakah ini cara yang benar untuk melakukannya?
this.state.arrayvar.push(newelement);
this.setState({arrayvar:this.state.arrayvar});
Saya khawatir bahwa memodifikasi array di tempat push
dapat menyebabkan masalah - apakah aman?
Alternatif membuat salinan array, dan setState
itu tampak boros.
javascript
reactjs
fadedbee
sumber
sumber
Jawaban:
The React docs mengatakan:
Anda
push
akan mengubah status secara langsung dan yang berpotensi menyebabkan kode rawan kesalahan, bahkan jika Anda "mengatur ulang" status lagi setelahnya. F. mis, itu bisa menyebabkan beberapa metode siklus hidup seperticomponentDidUpdate
tidak akan memicu.Pendekatan yang disarankan dalam versi Bereaksi yang berikutnya adalah menggunakan fungsi pembaru ketika memodifikasi kondisi untuk mencegah kondisi balapan:
Memori "limbah" bukan masalah dibandingkan dengan kesalahan yang mungkin Anda hadapi menggunakan modifikasi keadaan non-standar.
Sintaks alternatif untuk versi Bereaksi sebelumnya
Anda dapat menggunakan
concat
untuk mendapatkan sintaks yang bersih karena mengembalikan array baru:Di ES6 Anda dapat menggunakan Penyebar Operator :
sumber
push
mengembalikan panjang array baru sehingga tidak akan berfungsi. Juga,setState
async dan Bereaksi dapat mengantri beberapa perubahan status menjadi satu render pass.setState
dua kali, ini menunjukkan dua contoh yang sama dari pengaturan keadaan array tanpa memutasikannya secara langsung.let list = Array.from(this.state.list); list.push('woo'); this.setState({list});
Ubah preferensi gaya Anda tentu saja.Paling mudah, jika Anda menggunakan
ES6
.Array baru akan menjadi
[1,2,3,4]
untuk memperbarui keadaan Anda di Bereaksi
Pelajari lebih lanjut tentang perusakan array
sumber
Cara paling sederhana dengan
ES6
:sumber
tableData = [['test','test']]
Setelah mendorong array baru sayatableData = [['test','test'],['new','new']]
. cara mendorong @ David dan @Ridd ini[['test','test'],['new','new']]
mencoba:this.setState({ tableData: [...this.state.tableData, ['new', 'new']]
this.setState({ tableData: [...this.state.tableData ,[item.student_name,item.homework_status_name,item.comments===null?'-':item.comments] ] });
Ini memasukkan array baru dua kali.this.state.tableData.push([item.student_name,item.homework_status_name,item.comments===null?'-':item.comments]);
Ini mencapai hal yang saya inginkan. tapi itu bukan cara yang benar menurut saya.Bereaksi dapat mengumpulkan pembaruan, dan oleh karena itu pendekatan yang benar adalah menyediakan setState dengan fungsi yang melakukan pembaruan.
Untuk addon pembaruan Bereaksi, yang berikut ini akan berfungsi:
atau untuk concat ():
Berikut ini menunjukkan apa yang https://jsbin.com/mofekakuqi/7/edit?js,output sebagai contoh tentang apa yang terjadi jika Anda salah.
Doa setTimeout () menambahkan tiga item dengan benar karena React tidak akan mengelompokkan pembaruan dalam callback setTimeout (lihat https://groups.google.com/d/msg/reactjs/G6pljvpTGX0/0ihYw2zK9dEJ ).
OnClick yang buggy hanya akan menambahkan "Ketiga", tetapi yang tetap, akan menambahkan F, S dan T seperti yang diharapkan.
sumber
this.setState( update(this.state, {array: {$push: ["First", "Second", "Third"]}}) )
state.array = state.array.concat([4])
ini mengubah objek keadaan sebelumnya.Seperti @nilgun disebutkan dalam komentar, Anda dapat menggunakan help immutability react . Saya menemukan ini sangat berguna.
Dari dokumen:
Dorong sederhana
initialArray masih [1, 2, 3].
sumber
Jika Anda menggunakan komponen fungsional, harap gunakan ini seperti di bawah ini.
sumber
Untuk menambahkan elemen baru ke dalam array,
push()
harus jawabannya.Untuk menghapus elemen dan memperbarui status array, kode di bawah ini berfungsi untuk saya.
splice(index, 1)
tidak bisa bekerja.sumber
Saya mencoba untuk mendorong nilai dalam keadaan array dan menetapkan nilai seperti ini dan menentukan status array dan nilai push berdasarkan fungsi peta.
sumber
Ini berhasil bagi saya untuk menambahkan array dalam array
sumber
Inilah contoh 2020, Reactjs Hook yang saya pikir dapat membantu orang lain. Saya menggunakannya untuk menambahkan baris baru ke tabel Reactjs. Beri tahu saya jika saya bisa memperbaiki sesuatu.
Menambahkan elemen baru ke komponen status fungsional:
Tentukan data status:
Memiliki tombol memicu fungsi untuk menambahkan elemen baru
sumber
sumber
stackoverflow
.setState(state => ({arrayvar: [...state.arrayvar, ...newelement]}) );
newelement
objek dalam array melempar aTypeError
pula.sumber
Kode ini berfungsi untuk saya:
sumber
.push
mengembalikan nomor , bukan array.