在 redux reducers 更新时,它不应该是 state.slice().map 而不是 state.map() 吗?
In redux reducers when updating, should it not be state.slice().map instead of state.map()?
所以我正在浏览关于 Reducers 主题的 redux 文档,他们提到它应该是纯函数。我知道这是为了比较状态对象是相同的还是旧的。但我在 Redux Reducers documentation
处注意到以下代码片段
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 是纯函数,我们不应该在这里更新参数本身,对吗?
为什么 we/they 没有像下面那样使用 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
})
})
JavaScript Object.assign()
是一种构造函数方法,用于从现有的源对象构造新的目标对象。该方法创建源对象的副本并传递目标对象,仅当您提供空对象作为第一个参数时。您可以直接使用源对象,修改后的值将被覆盖到源对象的新副本。
在文档站点中,它清楚地提到了这一点。
根据 Docs“map()
方法创建一个新数组,其中填充了对调用数组中的每个元素调用提供的函数的结果。”所以我们没有改变传递给 reducer 函数的 state
参数,因此它是一个纯函数。
map()
已经 returns 一个新数组,所以不需要使用 slice()
所以我正在浏览关于 Reducers 主题的 redux 文档,他们提到它应该是纯函数。我知道这是为了比较状态对象是相同的还是旧的。但我在 Redux Reducers documentation
处注意到以下代码片段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 是纯函数,我们不应该在这里更新参数本身,对吗?
为什么 we/they 没有像下面那样使用 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
})
})
JavaScript Object.assign()
是一种构造函数方法,用于从现有的源对象构造新的目标对象。该方法创建源对象的副本并传递目标对象,仅当您提供空对象作为第一个参数时。您可以直接使用源对象,修改后的值将被覆盖到源对象的新副本。
在文档站点中,它清楚地提到了这一点。
根据 Docs“map()
方法创建一个新数组,其中填充了对调用数组中的每个元素调用提供的函数的结果。”所以我们没有改变传递给 reducer 函数的 state
参数,因此它是一个纯函数。
map()
已经 returns 一个新数组,所以不需要使用 slice()