【发布时间】:2015-11-27 18:05:15
【问题描述】:
我正在开发一个允许将“小部件”添加到页面并在 2D 空间中操作的 React/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 状态。选择状态reducer可以简化为(注意:我也在使用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" ]
}
}
这里的逻辑相当简单,例如找到所有选定小部件x 和y 值的min(),但我不确定我应该如何处理减速器组合,因为currentlySelectedWidgets 减速器无法访问widgets 部分状态树。我考虑过……
- 将减速器合并到一个减速器中:这似乎不是一个很好的可扩展解决方案。
- 通过操作传递当前的小部件列表:这似乎特别讨厌。
- 寻找更好的状态树建模方法:我有一个想法,但任何替代版本似乎都有其他缺点。
- 构建一个自定义
combineReducers()可以将小部件列表作为附加参数输入我的currentlySelectedWidgets()减速器:我认为这可能是我最好的选择。
我很想听听关于其他人如何管理类似情况的任何其他建议,似乎管理“当前选择”必须是其他人必须解决的常见状态问题。
【问题讨论】:
标签: javascript reactjs redux