reactjs - 在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
})
})
解决方案
根据文档, “该map()
方法创建了一个新数组,其中填充了在调用数组中的每个元素上调用提供的函数的结果。” 所以我们不会改变state
传递给 reducer 函数的参数,因此它是一个纯函数。
map()
已经返回一个新数组,所以没有必要使用slice()
推荐阅读
- python - 如何从以下结构创建数据框
- python - 如何让 Keras 预测成为一种热编码?
- c++ - 有没有更好的方法让类支持线程安全版本和不安全版本?
- r - 使用 pivot_longer 将水平格式改造成长格式
- javascript - 使用 ReactJS 提交后重定向
- python - PyInstaller 可执行文件无法获取 TorchScript 的源代码
- python - 将 Python 元组列表转换为 R 命名向量
- .net - 使用 Azure AD 管理 SQL 会话状态
- javascript - 如果下一个元素等于前一个元素,如何减少JS数组长度
- python - 了解访问字典 Python 中的键和值