Elimina l'elemento dall'array di stato in react


130

La storia è che dovrei riuscire a mettere Bob, Sally e Jack in una scatola. Posso anche rimuoverli dalla scatola. Quando viene rimosso, non viene lasciato alcuno slot.

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

Ora devo rimuovere, ad esempio, "Bob". Il nuovo array sarebbe:

["Sally", "Jack"]

Ecco il mio componente di reazione:

...

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

...

Qui ti mostro un codice minimo poiché c'è di più (onClick ecc.). La parte fondamentale è eliminare, rimuovere, distruggere "Bob" dall'array ma removePeople()non funziona quando viene chiamato. Qualche idea? Stavo guardando questo, ma potrei fare qualcosa di sbagliato poiché sto usando React.

Risposte:


169

Per rimuovere un elemento da un array, basta fare:

array.splice(index, 1);

Nel tuo caso:

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
Nel mio caso era: array.splice(array, 1);Grazie
Sylar

array.splice(array, 1);? Immagino che tu debba modificarlo .. Dovresti usare variabili diverse ...
Rayon

61
Quando usi React, dovresti generalmente evitare di modificare direttamente il tuo stato. È necessario creare un nuovo array e utilizzare setState().
iaretiga

2
In questo caso, consiglio di utilizzare Array.from (this.state.items) invece dell'operatore spread. Questo perché Array.from è destinato specificamente a questo utilizzo.
Francisco Hodge

2
Piccolo suggerimento, aggiungi un segno di spunta per "index! == -1" prima di unire l'array per evitare rimozioni indesiderate.
RoboBear

204

Quando usi React, non dovresti mai modificare lo stato direttamente. Se un oggetto (o Array, che è anche un oggetto) viene modificato, dovresti crearne una nuova copia.

Altri hanno suggerito di usarlo Array.prototype.splice(), ma quel metodo cambia Array, quindi è meglio non usarlo splice()con React.

Più facile da usare Array.prototype.filter()per creare un nuovo array:

removePeople(e) {
    this.setState({people: this.state.people.filter(function(person) { 
        return person !== e.target.value 
    })});
}

42
Sì, questo è un modo dichiarativo. Un metodo alternativo che utilizza prevState e le funzioni freccia:this.setState(prevState => ({ people: prevState.people.filter(person => person !== e.target.value) }));
Josh Morel

9
Questa dovrebbe essere la risposta accettata per l'idioma React dello stato mai mutante.
lux

9
o utilizzando l'indice:this.state.people.filter((_, i) => i !== index)
mb21

2
c'è una fetta che è imutabile e unire quella mutevole
Cassian

Il problema con questa risposta è che se hai più persone con lo stesso nome, le rimuoverai tutte. L'uso dell'indice è più sicuro nei casi in cui potresti avere dei
doppi

40

Ecco una piccola variazione sulla risposta di Aleksandr Petrov utilizzando ES6

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

17

Utilizzare .spliceper rimuovere l'elemento dall'array. Utilizzando delete, gli indici dell'array non verranno modificati ma il valore dell'indice specifico lo saràundefined

Il metodo splice () cambia il contenuto di un array rimuovendo gli elementi esistenti e / o aggiungendo nuovi elementi.

Sintassi: 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);

Modificare:

Come sottolineato da Justin-Grant , come regola generale, non mutare maithis.state direttamente, poiché la chiamata setState()successiva potrebbe sostituire la mutazione che hai fatto. Trattalo this.statecome se fosse immutabile.

L'alternativa è creare copie degli oggetti this.statee manipolarle, riassegnandole usando setState(). Array#map, Array#filterecc. potrebbero essere utilizzati.

this.setState({people: this.state.people.filter(item => item !== e.target.value);});

3
Assicurati di non utilizzare splice o qualsiasi metodo che modifichi direttamente la tua variabile di stato. Invece, ti consigliamo di creare una copia dell'array, rimuovere l'elemento dalla copia e quindi passare la copia a setState. Altre risposte contengono dettagli su come eseguire questa operazione.
Justin Grant

12

Modo semplice per eliminare l'elemento dall'array di stato in React:

quando i dati vengono eliminati dal database e dall'elenco di aggiornamento senza chiamata API quella volta che si passa l'ID cancellato a questa funzione e questa funzione rimuove i dati cancellati dall'elenco

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
Puoi spiegare in che modo questo differisce dalle altre 8 risposte su questa domanda di tre anni? Dalla recensione
Wai Ha Lee

nel codice sopra verrà ricreato un nuovo array di dati ma salterà "deletePostId" questo id
ANKIT-DETROJA

utilizzareitem.post_id !== deletePostId
Nimish goel

3

Alcune risposte hanno menzionato l'uso di "splice", che ha modificato l'array, come detto da Chance Smith. Ti suggerisco di usare la chiamata al metodo "slice" (il documento per "slice" è qui) che fa una copia dell'array originale.


3

È molto semplice prima di definire un valore

state = {
  checked_Array: []
}

Adesso,

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

Hai dimenticato di usare setState. Esempio:

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

Ma è meglio usare filterperché non muta l'array. Esempio:

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 doc per maggiori informazioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.