使用组合减速器时访问该州的其他部分
Accessing other parts of the state, when using combined reducers
NB:这是一个问题,与Redux非常相似;正在访问其他部分但它与路由器无关:(因此无法以相同的方式解决
当我减少状态的一部分时,我"感觉"我也需要访问其他部分。我承认,我可能只是"感觉不到"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日**
由于对这个问题的兴趣相对较高(atm上有15张选票),我在下面添加了我自己的答案,希望这对那些寻找答案的人有所帮助。
您不必使用combineReducers()
来自Redux官方文档:
这个助手只是一个方便!你可以自己写工作方式不同的
combineReducers
,甚至组装状态手动从子减速器中删除对象,并编写根减速器函数,就像编写任何其他函数一样。您可以在reducer层次结构的任何级别调用
combineReducers
。它不一定要发生在高层。事实上,你可以再次使用它将过于复杂的子减速器拆分为独立减速器孙辈等等。
所以你提出的解决方案肯定是你可以做到的一种方式
感谢@MichelleTilley引领思路!
我使用Thunk来getState()
,准备来自完整存储的数据,然后调度一个操作。
您可以将决策逻辑放入reducer或操作中。这取决于你。我喜欢减脂和减瘦,但没有对错之分。
Leonardo
简介
我想添加一个答案,这是基于我3y+的经验,还回顾了上面的一些其他答案和评论(感谢所有贡献者)
简短回答
可以使用原始combineReducers
。每个选择器都使用根状态。还原剂只会变异它是根状态的一部分。Reducer尽可能薄,只有Action(或Thunk)负责收集减少根状态部分所需的所有数据
详细答案
应用程序的减速器、操作和选择器是使用Ducks方法组织的。使用Redux Thunk有很多好处(多亏了Leonardo)。
如果我们使用我最初问题的定义,一个"鸭子"是"国家的一部分",它将以下主要项目分组:
- Reducer(通常是一个名为
%duckName%
的函数,用于接收) - 动作和雷声
- 选择器(接收根状态)
- 类型(
type
、interface
、enums
)
应用程序的状态-是一个对象。它的键是所有参与减少应用程序状态的"鸭子"的名称。
正如莱昂纳多所建议的那样,减径管应尽可能薄。
所有的动作和雷电,可以分为以下类别:
-
鸭子动作
- 内部没有选择器
- 自变量具有所有信息,这对于独立工作来说是足够的
- 返回Action对象
{ type: "%actionName%", payload: ... }
-
鸭鸣
- 没有外部选择器,但可以有内部选择器(从同一只鸭子中选择)
- 执行一个或多个鸭子动作的调度
- 可能会调度其他Duck Thunks,但应避免,因为这会导致应用程序的高度复杂性
-
智慧鸭鸣
- 知道其他鸭子的存在,因此可以从其他鸭子中选择
- 不应发送给其他鸭子,在这种情况下,它可能被视为应用程序操作
-
应用程序操作
- 返回Duck Action或其他带有修改参数的应用程序操作
-
应用程序Thunk
- 从任何一只鸭子中挑选
- 可能发送Thunk或Action中的任何一个
在某些情况下,您的代码库中可以有多个应用程序。您的应用程序可能会共享一些Ducks。有时您需要为每个应用程序创建Duck,这样您就可以传递一些配置。但这些都是另一回事:)
我已经试着在这个存储库中覆盖了其中的最小部分,我打算继续为它做贡献。它是用Typescript编写的。我希望它能更容易地理解
您可以尝试使用:
redux命名减速器
这允许你在代码中的任何地方获得状态,比如:
const localState1 = getState(reducerA.state1)
const localState2 = getState(reducerB.state2)
与组合reducer一起工作,这样每个reducer只处理本地状态,但如果需要,可以访问外部状态。
- 如何在My chrome扩展中获取其他chrome扩展的DOM访问权限
- 从其他元素上的单击事件访问image src属性
- 如何在本地存储(或其他数据库)上安全地保存敏感访问代码
- 如何使用其他地方指定的访问信息访问嵌套的json对象,而不使用eval或迭代
- 如何从其他方法访问Angular.js$scope
- 使用Javascript创建的Cookie在C#代码中不可访问..任何原因或其他选择
- 使用jQuery访问Special行中的其他同级
- Firefox扩展开发:如何在内容脚本中创建一个全局函数,以便其他加载的脚本文件可以访问它
- 存在其他参数时访问Javascript事件
- 访问jeditable内部的其他变量
- 从其他文件访问 Ext 甘特 JS 变量
- 从其他函数访问“this”类型的JavaScript变量
- 从其他HTML访问的javascript的动态值
- 寻找从其他函数访问映射对象
- 如何将网站设置为只能从其他页面访问
- Angular UI路由器-从其他状态访问statesparams
- SecurityError:当我试图从其他服务器访问镜像时,操作是不安全的
- 如何在javascript中从其他函数访问变量
- 从其他类访问 Webpack 类
- 从其他范围访问对象(javascript)