当我们触发一个操作时,redux的状态会发生什么?
- 我们有redux的当前状态
- 我们称之为行动
- 每个reducer在包含正确actionType的开关中查找自己的事例
- 每个reductor返回状态-即使在默认
return state
的情况下,每个reducter是否也会返回对该状态的新引用
如果状态在reducer中返回,实际会发生什么?它是否使用某种reduce函数来比较状态并调用render,然后返回新的引用并做出反应,然后比较是否有任何更改并调用reunder?
您在这里谈论的是一个由多个";切片";减速器通过CCD_ 2。类似这样的东西:
const rootReducer = combineReducers({
users: usersReducer,
posts: postsReducer,
})
假设我们dispatch
是一个类型为ADD_USER
的动作——这是usersReducer
会响应但postsReducer
不会响应的东西。
每个reducer都返回状态-即使在默认
return state
的情况下,每个reducers是否也会返回对该状态的新引用?
postsReducer
不关心此操作,只关心return state
。这是对现有对象的引用。所以state.posts
是相同的。
您可能会认为根usersReducer
将为其状态创建并返回一个新对象。因此,state.users
是对内存中与以前不同的对象的引用。如果state.user
的内部嵌套了其他数组或对象,则除非我们在reducer中替换了它们,否则这些对象将是相同的state
在处理combineReducers
时总是
const rootReducer = (state, action) => ({
users: usersReducer(state, action),
posts: postsReducer(state, action),
});
但实际的实现更为复杂,它涉及到一些检查,以防止不必要的对象创建。如果每个单独的reducer仅使用default: return state;
,则返回原始的state
对象。
以下是combineReducers
0函数的工作原理:
- 它有一个
boolean
标志属性hasChanged
,最初是false
- 它创建了一个
nextState
,它最初是一个空对象(很明显,这是一个新对象( - 它遍历每个单独的属性缩减器,并使用该属性的更新状态更新
nextState
。如果属性缩减器返回了新状态,则hasChanged
变为true
- 如果在调用了所有属性缩减器之后,
hasChanged
仍然是false
,那么它将忽略nextState
,而是返回原始的state
变量 - 否则返回CCD_ 32
当使用像useSelector
这样的React绑定时,它(默认情况下(会对返回值进行严格的相等性检查。因此,如果返回的新对象是前一个对象的精确副本,则会触发重新渲染,因为该对象是不同的引用。这就是为什么如果选择器涉及通过array.map
、array.filter
等创建对象,那么使用reselect
之类的东西来记忆选择器是很重要的。否则,每次都会有一个新的对象引用。useSelector
还支持自定义相等性检查,以便您可以控制何时重新渲染。