0

所以我正在阅读关于 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
    })
  })
4

2 回答 2

1

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

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

于 2020-07-12T13:15:49.270 回答
0

JavaScriptObject.assign()是一种构造方法,用于从现有的源对象构造新的目标对象。仅当您提供空对象作为第一个参数时,该方法才会创建源对象的副本并传递目标对象。您可以直接使用源对象,修改后的值将被覆盖到源对象的新副本中。

在文档站点中,它清楚地提到了这一点。

在此处输入图像描述

于 2020-07-12T13:09:09.463 回答