Hapus item dari array negara dalam bereaksi

130

Ceritanya, saya harus bisa memasukkan Bob, Sally dan Jack ke dalam sebuah kotak. Saya juga dapat menghapus keduanya dari kotak. Saat dilepas, tidak ada slot yang tersisa.

people = ["Bob", "Sally", "Jack"]

Sekarang saya perlu menghapus, katakan, "Bob". Array baru akan menjadi:

["Sally", "Jack"]

Inilah komponen react saya:

...

getInitialState: function() {
  return{
    people: [],
  }
},

selectPeople(e){
  this.setState({people: this.state.people.concat([e.target.value])})
},

removePeople(e){
  var array = this.state.people;
  var index = array.indexOf(e.target.value); // Let's say it's Bob.
  delete array[index];
},

...

Di sini saya menunjukkan kepada Anda kode minimal karena ada lebih dari itu (onClick dll). Bagian kuncinya adalah menghapus, membuang, menghancurkan "Bob" dari larik tetapi removePeople()tidak berfungsi saat dipanggil. Ada ide? Saya melihat ini tetapi saya mungkin melakukan sesuatu yang salah karena saya menggunakan React.

Sylar
sumber

Jawaban:

169

Untuk menghapus elemen dari array, lakukan saja:

array.splice(index, 1);

Dalam kasus Anda:

removePeople(e) {
  var array = [...this.state.people]; // make a separate copy of the array
  var index = array.indexOf(e.target.value)
  if (index !== -1) {
    array.splice(index, 1);
    this.setState({people: array});
  }
},
MarcoS
sumber
2
Dalam kasus saya: array.splice(array, 1);Terima kasih
Sylar
array.splice(array, 1);? Saya kira Anda perlu mengeditnya .. Anda harus menggunakan variabel yang berbeda ...
Rayon
61
Saat menggunakan React, Anda sebaiknya menghindari mutasi status Anda secara langsung. Anda harus membuat Array baru dan menggunakan setState().
iaretiga
2
Saya merekomendasikan menggunakan Array.from (this.state.items) daripada operator penyebaran dalam kasus ini. Ini karena Array.from secara khusus ditujukan untuk penggunaan ini.
Francisco Hodge
2
Saran kecil, tambahkan tanda centang untuk "index! == -1" sebelum menyambung array untuk mencegah penghapusan yang tidak diinginkan.
RoboBear
204

Saat menggunakan React, Anda tidak boleh mengubah status secara langsung. Jika sebuah objek (atau Array, yang juga merupakan objek) diubah, Anda harus membuat salinan baru.

Orang lain menyarankan untuk menggunakan Array.prototype.splice(), tetapi metode itu mengubah Array, jadi lebih baik tidak digunakan splice()dengan React.

Paling mudah digunakan Array.prototype.filter()untuk membuat array baru:

removePeople(e) {
    this.setState({people: this.state.people.filter(function(person) { 
        return person !== e.target.value 
    })});
}
iaretiga
sumber
42
Ya, ini cara deklaratif. Metode alternatif menggunakan fungsi prevState dan panah:this.setState(prevState => ({ people: prevState.people.filter(person => person !== e.target.value) }));
Josh Morel
9
Ini harus menjadi jawaban yang diterima sesuai dengan idiom React dari keadaan tidak pernah bermutasi.
lux
9
atau menggunakan indeks:this.state.people.filter((_, i) => i !== index)
mb21
2
ada potongan yang imut dan sambatan yang bisa berubah
Cassian
Masalah dengan jawaban ini adalah jika Anda memiliki beberapa orang dengan nama yang sama, Anda akan menghapus semua ini. Menggunakan indeks lebih aman jika Anda mungkin melakukan penipuan
klugjo
40

Berikut adalah variasi kecil pada respon Aleksandr Petrov menggunakan ES6

removePeople(e) {
    let filteredArray = this.state.people.filter(item => item !== e.target.value)
    this.setState({people: filteredArray});
}
Dmitry
sumber
17

Gunakan .spliceuntuk menghapus item dari larik. Dengan menggunakan delete, indeks larik tidak akan diubah tetapi nilai indeks tertentu akan diubahundefined

Metode splice () mengubah konten array dengan menghapus elemen yang ada dan / atau menambahkan elemen baru.

Sintaksis: array.splice(start, deleteCount[, item1[, item2[, ...]]])

var people = ["Bob", "Sally", "Jack"]
var toRemove = 'Bob';
var index = people.indexOf(toRemove);
if (index > -1) { //Make sure item is present in the array, without if condition, -n indexes will be considered from the end of the array.
  people.splice(index, 1);
}
console.log(people);

Edit:

Seperti yang ditunjukkan oleh justin-grant , Sebagai aturan praktis, Jangan pernah bermutasi this.statesecara langsung, karena menelepon setState()setelahnya dapat menggantikan mutasi yang Anda buat. Perlakukan this.stateseolah-olah itu tidak bisa diubah.

Alternatifnya adalah, membuat salinan objek this.statedan memanipulasi salinan, menugaskannya kembali menggunakan setState(). Array#map, Array#filterdll. dapat digunakan.

this.setState({people: this.state.people.filter(item => item !== e.target.value);});
Rayon
sumber
3
Pastikan untuk tidak menggunakan sambungan atau metode apa pun yang mengubah variabel status Anda secara langsung. Sebagai gantinya, Anda ingin membuat salinan larik, menghapus item dari salinan, lalu meneruskan salinannya ke setState. Jawaban lain memiliki detail tentang cara melakukan ini.
Justin Grant
12

Cara Mudah Untuk Menghapus Item Dari array negara di react:

ketika ada data yang dihapus dari database dan daftar pembaruan tanpa panggilan API saat itu Anda meneruskan id yang dihapus ke fungsi ini dan fungsi ini menghapus dihapus yang dihapus dari daftar

export default class PostList extends Component {
  this.state = {
      postList: [
        {
          id: 1,
          name: 'All Items',
        }, {
          id: 2,
          name: 'In Stock Items',
        }
      ],
    }


    remove_post_on_list = (deletePostId) => {
        this.setState({
          postList: this.state.postList.filter(item => item.post_id != deletePostId)
        })
      }
  
}

ANKIT-DETROJA
sumber
1
Bisakah Anda menjelaskan bagaimana ini berbeda dari 8 jawaban lain untuk pertanyaan tiga tahun ini? Dari ulasan
Wai Ha Lee
dalam kode di atas itu akan membuat ulang larik data baru tetapi lewati "deletePostId" id ini
ANKIT-DETROJA
penggunaanitem.post_id !== deletePostId
Nimish goel
3

Beberapa jawaban disebutkan menggunakan 'sambungan', yang sama seperti yang dikatakan Chance Smith, memutasikan larik. Saya akan menyarankan Anda untuk menggunakan panggilan Metode 'slice' (Dokumen untuk 'slice' ada di sini) yang membuat salinan dari array asli.

Arthur Chen
sumber
3

Ini Sangat Sederhana Pertama Anda Tentukan nilai

state = {
  checked_Array: []
}

Sekarang,

fun(index) {
  var checked = this.state.checked_Array;
  var values = checked.indexOf(index)
  checked.splice(values, 1);
  this.setState({checked_Array: checked});
  console.log(this.state.checked_Array)
}
QC innodel
sumber
1

Anda lupa menggunakan setState. Contoh:

removePeople(e){
  var array = this.state.people;
  var index = array.indexOf(e.target.value); // Let's say it's Bob.
  delete array[index];
  this.setState({
    people: array
  })
},

Tetapi lebih baik digunakan filterkarena tidak mengubah array. Contoh:

removePeople(e){
  var array = this.state.people.filter(function(item) {
    return item !== e.target.value
  });
  this.setState({
    people: array
  })
},
Aleksandr Petrov
sumber
1
removePeople(e){
    var array = this.state.people;
    var index = array.indexOf(e.target.value); // Let's say it's Bob.
    array.splice(index,1);
}

Redfer dokumen untuk info lebih lanjut

Gibbs
sumber