javascript - 为什么在 redux 中使用不可变数据结构时,选择器总是返回不可变的。?
问题描述
“你的选择器应该返回 Immutable.JS 对象”。“总是”。
为什么会这样?
解决方案
作为免责声明,情况并非“总是”如此,但文档试图在大多数情况下为您指明正确的方向。
由于 reselect 会记住选择器的返回结果,因此返回一个可变对象会使您容易受到棘手的错误的影响。想象以下场景:
// Immutable State
{
todos: [{ text: "hey"}, { todo: "text"}]
}
// Selectors
const getTodos = createSelector(state => state.todos, immutableTodos => immutableTodos.toJS())
选择getTodos
器返回一个普通的 JS 对象,默认情况下是可变的。现在想象多个使用getTodos
选择器的智能组件。
class EditTodos extends PureComponent {
constructor(props) {
this.state = { todos: props.todos }
}
addUnsavedTodo(newTodo) {
// Accidentally mutate the return result of getTodos
const newTodos = this.state.todos.push(newTodo)
this.setState({ todos: newTodos })
}
render() { // Some components for adding unsaved todos }
}
const mapStateToProps = (state) => ({ todos: getTodos(state))
同样使用的第二个组件getTodos
会在调用时立即看到新的“未保存”待办事项addUnsavedTodo
,这很可能是无意的。getTodos
假设 redux未更改,所有对 的调用state
都将获得相同的引用,并且任何突变都会影响所有消费者。
上面的示例是人为设计的,但希望它展示了返回纯 JS 对象可能存在风险的原因之一。
此外,正如文档所述,您应该限制使用,toJS
因为它会影响性能。在选择器中将不可变对象转换为纯 JS 对象没有任何好处
推荐阅读
- arangodb - 继承层次结构和startsWith
- python - 如何在pygame中使对象“跳跃”
- pdf - pyPDF2 错误 - PyPDF2.utils.PdfStreamError:流已意外结束
- c# - WPF Prism DataGrid 未更新
- python-3.x - 如何在 Python 中平均顶部或底部 'n' 值
- android - getString() 总是返回默认的语言字符串。如何检查应用程序是否正在寻找本地化的字符串文件?
- python - 在复杂语句上使用列表推导的最佳方法
- jquery - jquery load() 后提交不工作
- java - 尽管明显成功,Glassfish/JAX-RS 仍返回 404
- javascript - 为什么 interate 函数首先打印而不是 randQuestion 函数打印?