Я пытаюсь найти лучший способ удалить элемент из массива в состоянии компонента. Поскольку мне не следует изменять this.state
переменную напрямую, есть ли лучший (более краткий) способ удалить элемент из массива, чем тот, который у меня здесь ?:
onRemovePerson: function(index) {
this.setState(prevState => { // pass callback in setState to avoid race condition
let newData = prevState.data.slice() //copy array from prevState
newData.splice(index, 1) // remove element
return {data: newData} // update state
})
},
Спасибо.
обновленный
Это было обновлено для использования обратного вызова в setState. Это следует делать при обращении к текущему состоянию при его обновлении.
javascript
reactjs
aherriot
источник
источник
Ответы:
Самый чистый способ сделать это, что я видел, - это
filter
:источник
_
иногда используется для представления неиспользованного аргумента. Здесь это текущий элемент в массиве.this.state
качестве входных данныхthis.setState()
. пожалуйста, посмотрите мой ответ выше, где есть ссылка на официальную документацию React по этой теме.Вы можете использовать
update()
помощник неизменяемости fromreact-addons-update
, который фактически делает то же самое под капотом, но то, что вы делаете, нормально.источник
react-addons-update
устарела (2016).immutability-helper
доступен в качестве замены. github.com/kolodny/immutability-helper Также см. мой ответ ниже о том, что не следует изменять this.state непосредственно внутри this.setState ().Я считаю, что ссылки
this.state
внутриsetState()
не рекомендуется ( обновления состояния могут быть асинхронными ).Документы рекомендуют использовать
setState()
с функцией обратного вызова, чтобы prevState передавался во время выполнения, когда происходит обновление. Вот как это будет выглядеть:Использование Array.prototype.filter без ES6
Использование Array.prototype.filter с функциями стрелок ES6
Использование неизменяемости-помощника
Использование спреда
Обратите внимание, что в каждом экземпляре, независимо от используемой техники,
this.setState()
передается обратный вызов, а не ссылка на старый объектthis.state
;источник
this.setState({ data: [...this.state.data.slice(0, index), ...this.state.data.slice(index + 1)] });
неправильно ли использоватьthis.state
вместоprevState
опции обратного вызова, показанной @ user1628461?Вот способ удалить элемент из массива в состоянии с использованием синтаксиса распространения ES6.
источник
Я хочу поговорить здесь, хотя на этот вопрос уже был правильно дан ответ от @pscl на случай, если кто-то еще столкнется с той же проблемой, что и я. Из 4 предложенных методов я решил использовать синтаксис es6 со стрелочными функциями из-за его краткости и отсутствия зависимости от внешних библиотек:
Использование Array.prototype.filter с функциями стрелок ES6
Как видите, я сделал небольшую модификацию, чтобы игнорировать тип индекса (
!==
чтобы!=
), потому что в моем случае я получал индекс из строкового поля.Еще один полезный момент, если вы видите странное поведение при удалении элемента на стороне клиента, - НИКОГДА не использовать индекс массива в качестве ключа для элемента :
Когда React отличается от виртуальной DOM при изменении, он будет смотреть на ключи, чтобы определить, что изменилось. Поэтому, если вы используете индексы, а в массиве на один меньше, он удалит последний. Вместо этого используйте идентификаторы контента в качестве ключей, как это.
Вышеупомянутая выдержка из этого ответа из соответствующего сообщения .
Всем удачного кодирования!
источник
Вы можете использовать эту функцию, если хотите удалить элемент (без индекса)
источник
Как упоминалось в комментарии к ответу ephrion выше, filter () может работать медленно, особенно с большими массивами, поскольку он выполняет цикл для поиска индекса, который, по-видимому, уже определен. Это чистое, но неэффективное решение.
В качестве альтернативы можно просто «вырезать» нужный элемент и объединить фрагменты.
Надеюсь это поможет!
источник
Вы можете сделать код более читаемым с помощью однострочной вспомогательной функции:
затем используйте его так:
источник
Просто предложение, в вашем коде вместо использования
let newData = prevState.data
вы можете использовать распространение, представленное в ES6, то есть вы можете использоватьlet newData = ...prevState.data
для копирования массиваТри точки ... обозначают операторы распространения или параметры отдыха ,
Он позволяет раскрывать выражение массива или строку или что-либо, что может повторяться в местах, где ожидается ноль или более аргументов для вызовов функций или элементов для массива.
Кроме того, вы можете удалить элемент из массива следующим образом:
Надеюсь, это поможет !!
источник
Вот простой способ сделать это:
Надеюсь, поможет!!!
источник
delete
элемент удаляется, но индексы не обновляются, и поэтому этот подход не подходит для обычных нужд.