Фильтровать массив с объяснениями хуков? - PullRequest
1 голос
/ 10 февраля 2020

Может кто-нибудь объяснить мне, почему это не фильтрует toDoList

const handleDelete = e => {
    const { id } = e.currentTarget.parentElement;
    toDoList.filter(element => element._id !== id);
    setToDoList([...toDoList]);
  };

Пока это:

const handleDelete = e => {
    const { id } = e.currentTarget.parentElement;
    setToDoList(toDoList.filter(element => element._id !== id));
  };

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Причина этого в том, что Array.prototype.filter() возвращает новый отфильтрованный массив в конце. Прочитайте из документации:

Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

Во втором примере вы передаем его setToDoList, в то время как в первом код просто вызывает его, но не присваивает переменной.

Обратите внимание на следующее:

const toDoList = [{id: 1, name: 'first'}, {id: 2, name: 'second'}];
const id = 1;

toDoList.filter(element => element.id !== id);
console.log('original toDoList:', toDoList);

const result = toDoList.filter(element => element.id !== id);
console.log('filtered result:', result);

Надеюсь, это поможет!

0 голосов
/ 10 февраля 2020

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

...