Redux减速器参考



当我们触发一个操作时,redux的状态会发生什么?

  1. 我们有redux的当前状态
  2. 我们称之为行动
  3. 每个reducer在包含正确actionType的开关中查找自己的事例
  4. 每个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对象。

以下是combineReducers0函数的工作原理:

  • 它有一个boolean标志属性hasChanged,最初是false
  • 它创建了一个nextState,它最初是一个空对象(很明显,这是一个新对象(
  • 它遍历每个单独的属性缩减器,并使用该属性的更新状态更新nextState。如果属性缩减器返回了新状态,则hasChanged变为true
  • 如果在调用了所有属性缩减器之后,hasChanged仍然是false,那么它将忽略nextState,而是返回原始的state变量
  • 否则返回CCD_ 32

当使用像useSelector这样的React绑定时,它(默认情况下(会对返回值进行严格的相等性检查。因此,如果返回的新对象是前一个对象的精确副本,则会触发重新渲染,因为该对象是不同的引用。这就是为什么如果选择器涉及通过array.maparray.filter等创建对象,那么使用reselect之类的东西来记忆选择器是很重要的。否则,每次都会有一个新的对象引用。useSelector还支持自定义相等性检查,以便您可以控制何时重新渲染。

相关内容

  • 没有找到相关文章

最新更新