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.

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});
  }
},

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 
    })});
}

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});
}

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);});

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)
        })
      }
  
}


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.


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)
}

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
  })
},

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.