我一个反应,和/终极版应用程序,它允许“小工具”的工作被添加到一个页面,在二维空间操纵。需要一次选择和操作多个小部件。我目前的状态树的简化版本,看起来像下面...如何撰写Redux的减速与相关国家
{
widgets: {
widget_1: { x: 100, y: 200 },
widget_2: { x: 300, y: 400 },
widget_3: { x: 500, y: 600 }
},
selection: {
widgets: [ "widget_1", "widget_3" ]
}
}
我目前有此树由2级减速器一个管理widgets
状态和其他管理selection
状态管理。选择状态减速机可以简化为(注:我使用Immutable.js太)...
currentlySelectedWidgets(state = EMPTY_SELECTION, action) {
switch (action.type) {
case SET_SELECTION:
return state.set('widgets' , List(action.ids));
default:
return state
}
}
这一切似乎工作得非常好,但是我现在有我努力融入这个要求模型...
对于我需要有对当前选择UI目的具有的x/y属性是反射当前选择的窗口小部件的x/y坐标的左上角。示例状态可能看起来像......
{
widgets: {
widget_1: { x: 100, y: 200 },
widget_2: { x: 300, y: 400 },
widget_3: { x: 500, y: 600 }
},
selection: {
x: 100,
y: 200,
widgets: [ "widget_1", "widget_3" ]
}
}
这里的逻辑非常简单,找到min()
所有选定的部件x
和y
值,但我不确定我应该如何处理这种减速器组成,因为currentlySelectedWidgets
减速器无法访问状态树的widgets
部分。我考虑过...
- 将reducer合并为一个reducer:这似乎不是一个很好的可扩展解决方案。
- 传递部件的现有的清单,行动围绕:这似乎特别讨厌。
- 找到一个更好的方式来状态树模型:我有一个看法,但任何替代版本似乎有其他缺点。
- 构建定制
combineReducers()
可以养活小部件列表进入我的currentlySelectedWidgets()
减速机作为一个额外的参数:我想这可能是我最好的选择。
我很想听听其他人如何管理类似情况的其他建议,似乎管理“当前选择”必须是其他人必须解决的常见状态问题。
在尝试实施Hummlas的基于thunk的方法和基于重新选择的方法之后,我觉得这种方法更好地适应了我的模型,并提供了更清洁和更易维护的解决方案。我想我慢慢学习的一般经验法则是不在状态树中存储任何可以从现有树中重新计算的东西。 – andykent
忘记了,在这个例子的答案中有一个小错误,最后一个'minSelector(widget,selected)'应该读为'minCoordinateSelector(widgets,selected)',不太可能任何人都会按原样复制这段代码,但只是为了以防万一他们是这样。 – andykent