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


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.