Javascript Redux减速器参考
当我们触发一个动作时,redux的状态会发生什么变化Javascript Redux减速器参考,javascript,redux,react-redux,Javascript,Redux,React Redux,当我们触发一个动作时,redux的状态会发生什么变化 我们有redux的当前状态 我们称之为行动 每个减速器在包含正确actionType的开关中查找其自身的外壳 每个减速器返回状态-即使在默认的返回状态的情况下,每个减速器是否返回对状态的新引用 如果在reducer中返回状态,它会发生什么变化?它是否使用某种reduce函数来比较状态并调用rerender,然后返回新的引用并作出反应,然后比较是否有任何更改并调用rerender?您在这里所说的是一个减速机,它是由多个“切片”减速机通过组合减速
返回状态
的情况下,每个减速器是否返回对状态的新引用如果在reducer中返回状态,它会发生什么变化?它是否使用某种reduce函数来比较状态并调用rerender,然后返回新的引用并作出反应,然后比较是否有任何更改并调用rerender?您在这里所说的是一个减速机,它是由多个“切片”减速机通过
组合减速机组合而成的。大概是这样的:
const rootReducer = combineReducers({
users: usersReducer,
posts: postsReducer,
})
假设我们dispatch
一个类型为ADD\u USER
的操作——这是usersReducer
将响应的操作,但postsReducer
不会响应
每个减速器返回状态-即使在默认的返回状态
的情况下,每个减速器是否返回对状态的新引用
postsReducer
不关心此操作,只返回状态
。这是对现有对象的引用。所以state.posts
是相同的
usersReducer
将为其状态创建并返回一个新对象。因此,state.users
是对内存中与以前不同的对象的引用。如果在state.user
中嵌套了其他数组或对象,则这些对象将是相同的引用,除非我们在reducer中替换它们。因此,您要处理的是一个“浅层副本”,其中state.users
是一个新对象,但像state.users.byId[5]
这样的深度嵌套对象可能与以前完全相同
您可能认为根状态
在处理组合减速机
时始终是一个新的对象引用,因为它基本上是这样做的:
const rootReducer = (state, action) => ({
users: usersReducer(state, action),
posts: postsReducer(state, action),
});
但更为复杂,需要进行一些检查以防止不必要的对象创建。如果每个减速器只使用默认值:返回状态
然后返回原始的状态
对象
以下是combineReducers
功能的工作原理:
- 它有一个
boolean
标志属性hasChanged
,该属性最初为false
- 它创建了一个
nextState
,它最初是一个空对象(显然这是一个新对象)
- 它遍历每个单独的属性约简器,并使用该属性的更新状态更新
nextState
。如果属性缩减器返回新状态,则已更改
变为真
- 如果在调用所有属性约简后
hasChanged
仍为false
,则它将忽略nextState
,而是返回原始状态
变量
- 否则它将返回
nextState
当使用React绑定(如useSelector
)时,它(默认情况下)对返回的值进行严格的相等性检查。因此,如果返回的新对象是前一个对象的精确副本,它将触发重新渲染,因为该对象是不同的引用。这就是为什么如果选择器涉及通过array.map
、array.filter
等创建对象,则必须使用reselect
之类的方法来记忆选择器。否则每次都会有一个新的对象引用useSelector
也支持重新渲染,因此您可以控制重新渲染的时间。我建议您阅读一本Redux教程,如官方教程。或者我不理解您的问题。你能把它编辑得更具体些吗?添加一个代码示例来说明你所问的将有很大帮助。这是一个很好的教程@ RMCR714,这是一个很好的教程,当时ReDuX已经改变了很多,教程没有更新,所以它是非常过时的最佳实践和我们认为“现代”ReDux。我建议大家继续学习官方教程。