使用组合减速器时,访问该州的其他部分

时间:2015-12-17 11:54:46

标签: javascript redux

NB 这是一个问题,非常类似于Redux; accessing other parts... 它与路由器无关:(因此无法解决相同问题方式

当我减少一部分状态时,我“觉得”我也需要访问其他部分。我承认我可能会“误解”Redux的核心主体,或者在我的应用程序架构中存在缺陷。

我目前的解决方案是修改github:combineReducers.js的代码:

var finalState = mapValues(finalReducers, (reducer, key) => {
   var previousStateForKey = state[key]
   var nextStateForKey = reducer(previousStateForKey, action)
   ...
}

来自

   var nextStateForKey = reducer(previousStateForKey, action)

   var nextStateForKey = reducer(previousStateForKey, action, state)

这将允许我做我需要的事情:

function reducer(state, action, root) {
   if (root.otherPart.get("isSomething")) {
      return state.set("anotherThing", true);
   }
   return state;
}

问题是,如果我是以正确的方式做到这一点,还是应该使用不同的架构方法解决的问题,而无需从其他部分访问状态的一部分?

** 更新2018年12月5日 **

由于对这个问题的兴趣相对较高(15 up-votes atm),我在下面添加我自己的答案,希望对那些正在寻找答案的人有所帮助。

4 个答案:

答案 0 :(得分:12)

您不必使用combineReducers()

来自official Redux docs

  

这个助手只是方便!你可以自己写   combineReducers works differently,甚至是国家   手动从子reducers对象并写一个root减少   显式函数,就像你写任何其他函数一样。

     

您可以在reducer层次结构的任何级别调用combineReducers。它   不必发生在顶部。事实上,你可以再次使用它   把那些过于复杂的儿童减少者分成独立的   孙子,等等。

所以你建议的解决方案肯定是你可以做到的一种方式。

感谢@MichelleTilley领导的思路!

答案 1 :(得分:2)

我使用ThunkgetState(),从完整商店准备数据,然后发送操作。

您可以将决策逻辑放在reducer或action中。它是由你决定。我更喜欢胖动作和瘦削减者,但没有对错。

莱昂纳多

答案 2 :(得分:0)

您可以尝试使用:

redux-named-reducers

允许您在代码中的任何位置获取状态,如下所示:

const localState1 = getState(reducerA.state1)
const localState2 = getState(reducerB.state2)

使用combineReducers,每个reducer只处理本地状态,但如果需要可以访问外部状态。

答案 3 :(得分:0)

简介

我想添加一个答案,该答案基于我3年以上的经验,并总结了上面的其他一些答案和评论(感谢所有贡献者)

简短回答

可以使用原始的combineReducers。每个选择器都使用 Root State 。 Reducer仅对其 Root State 的一部分进行突变。 Reducer尽可能薄,只有Action(或Thunk)负责收集减少 Root State

部分所需的所有数据

详细答案

应用程序的化简器,操作和选择器使用Ducks方法进行组织。使用Redux Thunk会带来很多好处(多亏了Leonardo)。

如果我们使用第一个问题的定义,那么一个“鸭”(Duck)-是“国家的一部分”,它将以下主要项目归为一类:

  • Reducer(通常是名为%duckName%的函数,会接收)
  • 动作与暴躁
  • 选择器(接收根状态)
  • 类型(typeinterfaceenums

应用程序的状态-是一个对象。它的键-是参与降低应用程序状态的所有“鸭子”的名称。

应按照莱昂纳多(Leonardo)的建议,使减速器尽可能薄。

所有动作和恶棍,都可以分为以下几类:

  1. 鸭子行动
    • 内部没有选择器
    • 参数包含所有信息,足以用于独立工作
    • 返回操作对象{ type: "%actionName%", payload: ... }
  2. 鸭朋克
    • 没有外部选择器,但可以有内部选择器(从同一只鸭子中选择)
    • 发送一个或多个 Duck Actions
    • 可能会分派其他 Duck Thunks ,但应避免这样做,因为这会导致应用程序的高度复杂性。
  3. 智能鸭汤克
    • 意识到其他鸭子的存在,因此可以从其他鸭子中选择
    • 不得分派给其他鸭子,因为在这种情况下,它可能被视为应用程序操作
  4. 应用操作
    • 返回带有修改后的参数的 Duck Action 或其他 Application Action
  5. 应用程序崩溃
    • 具有来自任何鸭子的选择器
    • 可能会调度任何 Thunk Action

在某些情况下,您的代码库中可以有多个应用程序。您的应用程序可能共享一些鸭子。有时您需要为每个应用程序创建Duck,以便可以传递一些配置。但这是另一个故事的困惑:)

我已经尝试在this repository中覆盖其中的最小部分,我打算继续为此做出贡献。它是使用Typescript编写的。我希望它使理解起来更容易