2017-04-13 47 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不要在一个地方混淆不同的逻辑关注点。