レデューサーとアクションに関する初心者の質問。redux のドキュメントから:
アクションは、何かが起こったという事実を記述しますが、それに応じてアプリケーションの状態がどのように変化するかは指定しません。
と
同じ引数を指定すると、リデューサーは次の状態を計算して返す必要があります。驚く様な事じゃない。副作用はありません。API 呼び出しはありません。突然変異なし。ただの計算。
したがって、次のシナリオを考えてみます。
- ユーザーは地図上にポイントを配置し、それらのポイント間のルートを取得できます。
- ユーザーが最初にマップをクリックすると、これが開始点になります。彼が 2 回目にクリックしたとき - これが彼の終点です。その後クリックすると、前のポイントと終了位置の間にポイントが追加されます。
- 各ポイントが追加された後 (最初のポイントを除く)、新しいポイントと前のポイントの間のルートを計算する必要があります。したがって、S -> A -> F があり、ポイント B を追加する場合 (S -> A -> B -> F)、2 つのルートを計算する必要があります A -> B および B -> F
したがって、3+ ポイントを追加すると、2 つの副作用があります。
- リストの末尾以外に新しい点が配置されます
- 新しいルートは、フィニッシュ ポイントまで計算する必要があります。
Point 構造を次のようにモデル化すると:
// 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))
})
}
}
}
私にとって、これは「しかし、アプリケーションの状態がどのように変化するかを指定しないでください」と矛盾します-アクションから、新しいポイントを挿入する場所を指定しているためです。
レデューサーで挿入位置を計算できましたが、フィニッシュ ポイントのルート データを取得するにはどうすればよいですか?
ここで正しいアプローチは何ですか?