减速机对动作的新手问题。 From redux documentation:减速机vs动作
操作描述了事情发生的事实,但不响应指定 如何应用程序的状态变化。
和
由于相同的参数,减速机应计算下一个状态和 返回。没有惊喜。无副作用。没有API调用。没有突变。 只是一个计算。
因此,如果我们考虑以下情形:
- 用户可以将地图上的点,并得到这些点之间的路线。
- 当用户第一次点击地图时,这是他的出发点。当他第二次点击 - 这是他的终点。随后的点击会在前一个点和结束位置之间添加点。
- 每个点后,加入(除了第一个)必须新点和前一个点之间计算出的路线。所以如果我有S - > A - > F并加点B(S - > A - > B - > F)必须计算两条路线A→B和B→F
因此,的有两个副作用在添加任何3+点:
- 新点位于不在名单
- 新航线必须计算到终点的结束。
如果我将点结构的模型,因为这:
// typescript
interface Point {
coordinates;
routeTo?;
}
我是正确执行的项目位置计算和操作路线检索,如:
// pseudo code
export function addMapPoint(newPoint) {
return (dispatch, getState) => {
const {points} = getState();
const position = getInsertPosition(points, newPoint)
dispatch(addPoint(newPoint, position));
if (points.length >= 2) {
const previousPoint = getPreviousPoint(points, position);
calculateRoute(newPoint, previousPoint).then(route => {
dispatch(updateRoute(newPoint, route))
})
}
}
}
对我来说,这在某种程度上违背到“但不指定应用程序的状态如何改变” - 因为从行动我指定插入我的新点的位置。
我可以计算减速器中的插入位置,但是如何获取完成点的路径数据?
这里的正确方法是什么?
所以看看你提出的'addPointAndUpdateRoutes =(point,index)'和'addPoint(point,index)'签名 - 索引计算是否被移动到了ui?但是如果我可以通过点击手动输入坐标的地图来添加一个点呢?关于'calculateRoutes'如果我有100分呢?或200?每次遍历整个列表,检查一些缓存(又一个状态......),并且用户是否可以始终从头开始?那么我必须使该缓存失效。 – gerasalus
我猜你可以在UI中计算'index',我的意思是在两个已有点之间添加一个点可以在UI中非常清晰地表达出来。关于'calculateRoutes' - 你需要一个memoized函数,这意味着如果它已经计算出一个路由,它会立即返回它,这个实现需要在你的客户端和你的服务器上。如果用户有100或1000或甚至5000点,那么它并不重要,只要没有真正计算,它会发生得非常快。无论如何,如果你支持100分,你将不得不计算它们,不管UI的实现。 –
以及我的观点是,我可能有两个,四个或五个不同的地方,我可以添加一个点。逻辑保持不变 - 如果第一个点 - 添加,第二个 - 添加它,如果第三个 - 在最后一个之前添加等等。所以这个逻辑不应该在每个UI组件中被复制。如果我使用聪明的calculateRoutes方法,这可以在reducer中完成(但是是吗?)。或者为什么我应该分开存放路线 - 他们不能没有一点生活。如果无法达到某个点,则可能没有路线,从而导致“终点”也可能无法到达的副作用。 – gerasalus