Saya mencoba menemukan cara terbaik untuk menghapus elemen dari array dalam keadaan komponen. Karena saya tidak boleh memodifikasi this.state
variabel secara langsung, apakah ada cara yang lebih baik (lebih ringkas) untuk menghapus elemen dari array daripada yang saya miliki di sini ?:
onRemovePerson: function(index) {
this.setState(prevState => { // pass callback in setState to avoid race condition
let newData = prevState.data.slice() //copy array from prevState
newData.splice(index, 1) // remove element
return {data: newData} // update state
})
},
Terima kasih.
diperbarui
Ini telah diperbarui untuk menggunakan panggilan balik di setState. Ini harus dilakukan ketika merujuk kondisi saat ini saat memperbaruinya.
javascript
reactjs
aherriot
sumber
sumber
Jawaban:
Cara terbersih untuk melakukan ini yang saya lihat adalah dengan
filter
:sumber
_
kadang-kadang digunakan untuk mewakili argumen yang tidak digunakan. Di sini, ini adalah item saat ini dalam array.this.state
sebagai masukan untukthis.setState()
, bahkan secara tetap, tidak direkomendasikan. silakan lihat jawaban saya di atas untuk referensi ke dokumen Bereaksi resmi tentang topik ini.Anda dapat menggunakan bantuan
update()
immutability darireact-addons-update
, yang secara efektif melakukan hal yang sama di bawah tenda, tetapi apa yang Anda lakukan baik-baik saja.sumber
react-addons-update
sekarang tidak digunakan lagi (2016).immutability-helper
tersedia sebagai pengganti. github.com/kolodny/immutability-helper Juga silakan lihat jawaban saya di bawah ini tentang tidak bermutasi this.state langsung di dalam this.setState ().Saya percaya referensi
this.state
di dalamsetState()
tidak disarankan ( Pembaruan Negara Mungkin Tidak Sinkron ).Docs merekomendasikan penggunaan
setState()
dengan fungsi callback sehingga prevState diteruskan saat runtime ketika pembaruan terjadi. Jadi begini tampilannya:Menggunakan Array.prototype.filter tanpa ES6
Menggunakan Array.prototype.filter dengan ES6 Arrow Functions
Menggunakan immutability-helper
Menggunakan Spread
Perhatikan bahwa dalam setiap contoh, terlepas dari teknik yang digunakan,
this.setState()
diteruskan dengan panggilan balik, bukan referensi objek ke yang lamathis.state
;sumber
this.setState({ data: [...this.state.data.slice(0, index), ...this.state.data.slice(index + 1)] });
apakah salah menggunakanthis.state
bukanprevState
opsi callback yang ditunjukkan oleh @ user1628461?Berikut adalah cara untuk menghapus elemen dari array di negara bagian menggunakan sintaks menyebar ES6.
sumber
Saya ingin berpadu di sini meskipun pertanyaan ini sudah dijawab dengan benar oleh @pscl jika ada orang lain yang mengalami masalah yang sama saya lakukan. Dari 4 metode memberi saya memilih untuk menggunakan sintaks es6 dengan fungsi panah karena itu keringkasan dan kurangnya ketergantungan pada perpustakaan eksternal:
Menggunakan Array.prototype.filter dengan ES6 Arrow Functions
Seperti yang Anda lihat, saya membuat sedikit modifikasi untuk mengabaikan jenis indeks (
!==
untuk!=
) karena dalam kasus saya, saya mengambil indeks dari bidang string.Hal lain yang bermanfaat jika Anda melihat perilaku aneh ketika menghapus elemen di sisi klien adalah untuk TIDAK PERNAH menggunakan indeks array sebagai kunci untuk elemen :
Ketika Bereaksi berbeda dengan DOM virtual pada perubahan, itu akan melihat tombol untuk menentukan apa yang telah berubah. Jadi jika Anda menggunakan indeks dan ada satu yang kurang dalam array, itu akan menghapus yang terakhir. Alih-alih, gunakan id konten sebagai kunci, seperti ini.
Di atas adalah kutipan dari jawaban ini dari pos terkait .
Selamat Mengkode Semuanya!
sumber
Anda dapat menggunakan fungsi ini, jika Anda ingin menghapus elemen (tanpa indeks)
sumber
Seperti disebutkan dalam komentar untuk jawaban ephrion di atas, filter () bisa lambat, terutama dengan array besar, karena loop untuk mencari indeks yang tampaknya sudah ditentukan. Ini adalah solusi yang bersih, tetapi tidak efisien.
Sebagai alternatif, seseorang dapat dengan mudah 'memotong' elemen yang diinginkan dan menyatukan fragmen-fragmen.
Semoga ini membantu!
sumber
Anda dapat membuat kode lebih mudah dibaca dengan fungsi pembantu satu baris:
lalu gunakan seperti ini:
sumber
Hanya sebuah saran, dalam kode Anda alih-alih menggunakan
let newData = prevState.data
Anda dapat menggunakan spread yang diperkenalkan dalam ES6 yang dapat Anda gunakanlet newData = ...prevState.data
untuk menyalin arrayTiga titik ... mewakili Penyebar Operator atau Parameter Istirahat ,
Ini memungkinkan ekspresi array atau string atau apa pun yang dapat iterasi untuk diperluas di tempat-tempat di mana nol atau lebih argumen untuk panggilan fungsi atau elemen untuk array diharapkan.
Selain itu Anda dapat menghapus item dari array dengan mengikuti
Semoga ini berkontribusi !!
sumber
Berikut ini cara mudah untuk melakukannya:
Semoga Membantu !!!
sumber
delete
menghapus item tetapi indeks tidak diperbarui dan oleh karena itu ini bukan pendekatan yang baik untuk kebutuhan reguler.