Видаліть елемент з масиву стану в реакції


130

Історія полягає в тому, що я повинен бути в змозі покласти Боба, Саллі та Джека в коробку. Я також можу вийняти або з коробки. Після вилучення слот не залишається.

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

Мені зараз потрібно зняти, скажімо, «Боб». Новим масивом буде:

["Sally", "Jack"]

Ось мій компонент реакції:

...

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

...

Тут я показую вам мінімальний код, оскільки його є більше (onClick тощо). Ключова частина полягає в тому, щоб видалити, видалити, знищити "Bob" з масиву, але removePeople()не працює при виклику . Будь-які ідеї? Я дивився на це, але, можливо, роблю щось не так, оскільки використовую React.

Відповіді:


169

Щоб видалити елемент з масиву, просто виконайте:

array.splice(index, 1);

У вашому випадку:

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
У моєму випадку це було: array.splice(array, 1);Спасибі
Sylar

array.splice(array, 1);? Я думаю, вам потрібно відредагувати його. Ви повинні використовувати різні змінні ...
Район,

61
Використовуючи React, ви, як правило, уникати мутації свого стану безпосередньо. Вам слід створити новий масив та використовувати setState().
iaretiga

2
Я рекомендую використовувати Array.from (this.state.items) замість оператора розповсюдження в цьому випадку. Це тому, що Array.from спеціально призначений для цього використання.
Франсіско Ходж

2
Невелика пропозиція, додайте чек на "index! == -1", перш ніж сплачувати масив, щоб запобігти небажаному видаленню.
RoboBear

202

Використовуючи React, ви ніколи не повинні мутувати стан безпосередньо. Якщо об'єкт (або Array, який теж є об’єктом) змінено, вам слід створити нову копію.

Інші пропонують використовувати Array.prototype.splice(), але цей метод мутує Array, тому краще не використовувати splice()з React.

Найпростіше використовувати Array.prototype.filter()для створення нового масиву:

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

42
Так, це декларативно. Альтернативний метод за допомогою функцій prevState та стрілок:this.setState(prevState => ({ people: prevState.people.filter(person => person !== e.target.value) }));
Джош Морель

9
Це має бути прийнятою відповіддю за ідіомою Реагу, яка ніколи не мутує стан.
люкс

9
або за допомогою індексу:this.state.people.filter((_, i) => i !== index)
mb21

2
є зріз , який imutable і сплайсинг , що змінне
Касіян

Питання з цією відповіддю полягає в тому, що якщо у вас є кілька осіб з однаковим іменем, ви видалите все це. Використання індексу безпечніше в тих випадках, коли у вас можуть бути
дупи

40

Ось незначна зміна у відповіді Олександра Петрова за допомогою ES6

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

17

Використовуйте .spliceдля видалення елемента з масиву. Використовуючи delete, індекси масиву не будуть змінені, але значення конкретного індексу будеundefined

Метод splice () змінює вміст масиву, видаляючи існуючі елементи та / або додаючи нові елементи.

Синтаксис: 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);

Редагувати:

Як вказує Justin-grant , як правило, ніколи не мутуйте this.stateбезпосередньо, оскільки дзвінок setState()після цього може замінити зроблену вами мутацію. Ставтесь this.stateтак, ніби це було непорушним.

Альтернативою є створення копій об'єктів this.stateі маніпулювання копіями, присвоєння їх назад за допомогою setState(). Array#map, І Array#filterт.д. можуть бути використані.

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

3
Не переконайтеся, що не використовується сплайс або будь-який метод, який безпосередньо змінює стан змінної. Натомість ви захочете зробити копію масиву, вилучити елемент із копії та передати копію в setState. Інші відповіді мають детальну інформацію про те, як це зробити.
Джастін Грант

12

Простий спосіб видалення елемента з масиву стану реагувати:

коли будь-які дані видаляються із бази даних та списку оновлень без виклику API, коли ви передаєте видалений ідентифікатор цій функції, і ця функція видаляє видалені відновлені зі списку

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
Чи можете ви пояснити, чим це відрізняється від 8 інших відповідей на це трирічне запитання? З відгуку
Вай Ха Лі

у наведеному вище коді він відтворить новий масив даних, але пропустить "deletePostId" цей ідентифікатор
ANKIT-DETROJA

використанняitem.post_id !== deletePostId
німішський голль


3

Дуже просто спочатку Ви визначаєте значення

state = {
  checked_Array: []
}

Тепер,

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

Ви забули використовувати setState. Приклад:

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

Але краще використовувати, filterоскільки він не мутує масив. Приклад:

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 документ для отримання додаткової інформації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.