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),我在下面添加我自己的答案,希望对那些正在寻找答案的人有所帮助。
答案 0 :(得分:12)
您不必使用combineReducers()
。
这个助手只是方便!你可以自己写
combineReducers
works differently,甚至是国家 手动从子reducers对象并写一个root减少 显式函数,就像你写任何其他函数一样。您可以在reducer层次结构的任何级别调用
combineReducers
。它 不必发生在顶部。事实上,你可以再次使用它 把那些过于复杂的儿童减少者分成独立的 孙子,等等。
所以你建议的解决方案肯定是你可以做到的一种方式。
感谢@MichelleTilley领导的思路!
答案 1 :(得分:2)
我使用Thunk到getState()
,从完整商店准备数据,然后发送操作。
您可以将决策逻辑放在reducer或action中。它是由你决定。我更喜欢胖动作和瘦削减者,但没有对错。
莱昂纳多答案 2 :(得分:0)
您可以尝试使用:
允许您在代码中的任何位置获取状态,如下所示:
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)-是“国家的一部分”,它将以下主要项目归为一类:
%duckName%
的函数,会接收)type
,interface
,enums
)应用程序的状态-是一个对象。它的键-是参与降低应用程序状态的所有“鸭子”的名称。
应按照莱昂纳多(Leonardo)的建议,使减速器尽可能薄。
所有动作和恶棍,都可以分为以下几类:
{ type: "%actionName%", payload: ... }
在某些情况下,您的代码库中可以有多个应用程序。您的应用程序可能共享一些鸭子。有时您需要为每个应用程序创建Duck,以便可以传递一些配置。但这是另一个故事的困惑:)
我已经尝试在this repository中覆盖其中的最小部分,我打算继续为此做出贡献。它是使用Typescript编写的。我希望它使理解起来更容易