Javascript Redux减速器参考

Javascript Redux减速器参考,javascript,redux,react-redux,Javascript,Redux,React Redux,当我们触发一个动作时,redux的状态会发生什么变化 我们有redux的当前状态 我们称之为行动 每个减速器在包含正确actionType的开关中查找其自身的外壳 每个减速器返回状态-即使在默认的返回状态的情况下,每个减速器是否返回对状态的新引用 如果在reducer中返回状态,它会发生什么变化?它是否使用某种reduce函数来比较状态并调用rerender,然后返回新的引用并作出反应,然后比较是否有任何更改并调用rerender?您在这里所说的是一个减速机,它是由多个“切片”减速机通过组合减速

当我们触发一个动作时,redux的状态会发生什么变化

  • 我们有redux的当前状态
  • 我们称之为行动
  • 每个减速器在包含正确actionType的开关中查找其自身的外壳
  • 每个减速器返回状态-即使在默认的
    返回状态
    的情况下,每个减速器是否返回对状态的新引用

  • 如果在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。我建议大家继续学习官方教程。