Почему бы не использовать сплайс с оператором распространения для удаления элемента из массива в реаги? - PullRequest
3 голосов
/ 12 октября 2019

splice () изменяет исходный массив и его следует избегать. Вместо этого, один хороший вариант - использовать filter () , который создает новый массив, поэтому не изменяет состояние. Но я использовал для удаления элементов из массива, используя splice () с оператором распространения.

removeItem = index => {
  const items = [...this.state.items];
  items.splice(index, 1);

  this.setState({ items });
}

Так что в этом случае, когда я регистрирую items изменения, но this.state.items остается неизменным. Вопрос в том, почему все используют filter вместо splice с spread? Есть ли у него минусы?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

filter() имеет более функциональный подход, который имеет свои преимущества. Работать с неизменяемыми данными намного проще, параллелизм и безопасность ошибок.

Но в вашем примере вы делаете нечто подобное, создавая массив items. Таким образом, вы по-прежнему не изменяете существующие массивы.


const items = [...this.state.items];

Создает копию this.state.items, поэтому она не будет мутировать их, как только вы выполните splice().

Таким образом, учитывая ваш подход, он ничем не отличается от filter(), поэтому теперь он сводится к вопросу вкуса.

const items = [...this.state.items];
items.splice(index, 1);

VS

this.state.items.filter(i => ...);

Также производительность может быть принята во внимание. Проверьте это test например.

0 голосов
/ 12 октября 2019
 const items = [...this.state.items]; // spread
 const mutatedItems = this.state.items.filter(() => {}) // filter

они одинаковы.
хотя я обнаружил, что спред-линия сбивает с толку и менее интуитивно понятна, чем фильтр.

но я предпочитаю деструктуризацию:

 const { items } = this.state // destructure
 item.splice()

почему? потому что иногда внутри функции / метода у меня есть другое назначение деструктурирования, такое как

  const { modalVisible, user } = this.state

Так что я думаю, почему бы и там не деструктировать item. Для тех, кто пишет много кодов в нескольких кодовых базах, было бы очень полезно поработать над тем, «насколько точный и быстрый этот код может быть снят?»так как я сам не помню, что написал на прошлой неделе.
Хотя использование спреда заставило бы меня написать больше строк и не помогло, когда я перечитал его в следующем месяце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...