首页 > 解决方案 > 在redux reducers中更新时,不应该是state.slice().map而不是state.map()吗?

问题描述

所以我正在阅读关于 Reducers 主题的 redux 文档,他们提到它应该是纯函数。我知道这是为了比较状态对象是相同的还是旧的。但我在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 数组并使用 map 运算符。这意味着 map 将更新传递的 state 参数。考虑到 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
    })
  })

标签: reactjsreduxredux-reducers

解决方案


根据文档, “该map()方法创建了一个新数组,其中填充了在调用数组中的每个元素上调用提供的函数的结果。” 所以我们不会改变state传递给 reducer 函数的参数,因此它是一个纯函数。

map()已经返回一个新数组,所以没有必要使用slice()


推荐阅读