2017-04-13 121 views
0

狀態得到由隨機產生的數字陣列(+ 0)的函數的水合如下:Redux狀態:動作還是選擇器?

[[3,0],[6,0],[8,0],[2,0 ] .....]

這就是目前應用的狀態。 [3,0]是包含數字3並且不可見(0)的瓦片的示例。一旦我點擊瓦片,它就調度一個動作,並且相應元素的0變爲1,並且基於該瓦片揭示顯示(3)

所以,如果我點擊第一個瓷磚,狀態將變爲: [[3,1],[6,0],[8,0],[2,0] .. ...]

現在,我想添加以下內容:(即有1s爲第二元素)

  • 軌道許多瓷磚是如何發現在任何時間。

  • 極限裸露磚,以2號(如果第二瓷磚的數量不匹配的第一個,無論是再次獲得覆蓋 - 許多記憶遊戲也有類似的功能)

  • ,如果我發現一個瓷磚,然後第二個和數字相匹配,我希望他們永久不被發現,並且我們給分數加1。

我應該將它設計爲主狀態的不同部分(使用不同的減速器,然後組合減速器)?或者我應該重新設計狀態的第一部分包括,如下所示:

initialState = { 
    grid: [[3,0], [4,0],...], 
    score: 0, 
    number_of_uncovered_tiles: 0 
} 

我們改變比分的價值觀和number_of_uncovered_tiles - 我是正確的,我不應該使用的行動,但選擇既將只是基於網格數組元素值的狀態自動計算?

回答

1

通常建議儘可能保持您的狀態平坦,避免由單個reducer操作的深層嵌套層次結構。

在你的情況下,我會分裂grid減速機和uncoveredTiles減速機。這將使您更好地控制揭示瓦片,而不需要一遍又一遍地重複運行瓦片陣列。

{ 
    grid: [ 3, 4, 9, ...], 
    score: 0, 
    uncoveredTiles: [ 0, 2 ], 
} 

這樣結束磚當兩個被打開只是物質的更新grid[uncoveredTiles[0]]grid[uncoveredTiles[1]]和正在重置uncoveredTiles[]

如果你的瓷磚數據會變得更復雜(例如你將交換數字與圖像)只有grid減速器將不得不改變,而uncoveredTiles將保持不變。

另外,我會考慮引入單獨的減速器scores不要在一個地方混淆不同的邏輯關注點。