В редукторах redux при обновлении не должно быть state.slice (). Map вместо state.map ()? - PullRequest
0 голосов
/ 12 июля 2020

Итак, я просматривал документацию redux по Reducers topi c, и они упомянули, что это должны быть чистые функции. Я понимаю, что это для сравнения того, является ли объект состояния таким же или старым. Но я заметил следующий фрагмент кода в документации Redux Reducers

case TOGGLE_TODO:
  return Object.assign({}, state, {
    todos: state.todos.map((todo, index) => {
      if (index === action.index) {
        return Object.assign({}, todo, {
          completed: !todo.completed
        })
      }
      return todo
    })
  })

Здесь они напрямую обращаются к массиву state.todos и используют оператор карты. Это означает, что карта обновит переданный параметр состояния. Учитывая, что здесь reducer является чистой функцией, мы не должны обновлять сами параметры здесь, правильно?

Почему мы / они не используем slice () здесь, как должно быть ниже?

case TOGGLE_TODO:
  return Object.assign({}, state, {
    todos: state.todos.slice().map((todo, index) => {
      if (index === action.index) {
        return Object.assign({}, todo, {
          completed: !todo.completed
        })
      }
      return todo
    })
  })

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Согласно Docs «Метод map() создает новый массив, заполненный результатами вызова предоставленной функции для каждого элемента в вызывающем массиве». поэтому мы не изменяем параметры state, переданные функции редуктора, следовательно, это чистая функция.

map() уже возвращает новый массив, поэтому нет необходимости использовать slice()

0 голосов
/ 12 июля 2020

JavaScript Object.assign() - это метод конструктора, используемый для создания нового целевого объекта из существующего исходного объекта. Метод создает копию исходного объекта и доставляет целевой объект, , только если вы указываете пустой объект в качестве первого аргумента . Вы можете использовать исходный объект напрямую, и измененные значения перезаписываются в новую копию исходного объекта.

На сайте документации это явно упоминается.

введите описание изображения здесь

...