我一個反應,和/終極版應用程序,它允許「小工具」的工作被添加到一個頁面,在二維空間操縱。需要一次選擇和操作多個小部件。我目前的狀態樹的簡化版本,看起來像下面...如何撰寫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