【いらすとや図解】はじめてのRedux ~DispatchとかReducerを理解する~

## はじめに
Reduxの概要をざっくり理解するための記事を書きました。
今回はコードでの解説ではなく、イラストやを使ってできるだけわかりやすく説明しています。Reduxを知るきっかけになれば幸いです。

## この記事のゴール
### 公式ドキュメントに掲載されている下記画像の概要をざっくり理解する
俗にいう「一方向データフロー」の解説です

↓幸せスパ⚪︎ラルっぽいやつ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/3f2fa6dc-bc5b-4260-01ac-7863fbeb981f.png" width="500px" />

↓一度は聞いたことがあるだろうDispatch、Reducer など
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/ab75cc02-d780-bc6e-bff3-90490abecdbc.gif" width="500px" />

画像引用元

https://redux.js.org/tutorials/essentials/part-1-overview-concepts


## State、View、Actions
まずは先ほど紹介した以下の画像に関して説明したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/3f2fa6dc-bc5b-4260-01ac-7863fbeb981f.png" width="300px" />

[公式ドキュメント](https://redux.js.org/tutorials/essentials/part-1-overview-concepts#redux-terms-and-concepts)を超ざっくり解説すると以下のような感じになります。

- **state**
  - 状態
- **View**
  - 状態を表示させる見た目
- **Actions**
  - 状態を変える指示


これを入金処理で例える以下の通りです
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/a3577e3b-9cbd-3f54-51eb-b5fb0881c8b3.png" width="500px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/cb5fde53-cb71-8eee-4f9d-7bcec45b9c2d.png" width="500px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/08cdd1d6-91dc-c21f-9ca3-f63b54d52c08.png" width="500px" />


## Dispatch、Reducer、Store
次に以下の画像に関して説明したいと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/ab75cc02-d780-bc6e-bff3-90490abecdbc.gif" width="300px" />
[公式ドキュメント](https://redux.js.org/tutorials/essentials/part-1-overview-concepts#redux-application-data-flow)を超ざっくり解説すると以下のような感じになります。

- **Store**
  - state(状態)を保持している場所
- **Dispatch**
  - Actions(状態を変える指示)をStoreに伝える
- **Reducer**
  - state(状態)を書き換える「唯一」の概念

これを入金処理で例える以下の通りです
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/933a9db9-def9-e443-49c7-562e7438c5f4.png" width="500px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/98d7fd7f-f3e9-f463-b75d-3866e145bbf8.png" width="500px" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/ddb84a87-9155-00a2-73be-ea59050b8d24.png" width="500px" />




## 3つの原則
Reduxには3つの原則(セオリー)があります

https://redux.js.org/understanding/thinking-in-redux/three-principles
- **値の保管場所は単一(Single source of truth)**
  - 全てのStateは1つのオブジェクトとして管理され、1つのStoreで保持されるべき
- **値は読み取り専用(State is read-only)**
  - Stateを変更する唯一の方法は、変更内容を持ったActionを通すこと 
- **変更は純粋な関数で行う(Changes are made with pure functions)**
  - 同じ引数を渡されたら必ず同じ結果を返す関数



**値の保管場所は単一のアンチパターン**
複数のstoreでstateを管理する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/301bc38c-9722-d1d9-3cd0-783c662f1ea0.png" width="500px" />

**値は読み取り専用のアンチパターン**
Actions以外の処理でstateを更新する(入金前の残高が10,000円の場合)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/3a5c9e00-073c-278f-84bb-f9b9ec08740d.png" width="500px" />

**変更は純粋な関数で行うのアンチパターン**
Actionsの結果がランダム(入金前の残高が10,000円の場合)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/707917e9-c26a-87cf-9203-7115ed000b06.png" width="500px" />


## おわりに
ReduxのDispatchとかReducerは最初なかなか理解しにくいと思いますが、この記事が参考になれば幸いです。
最後までお読みいただきありがとうございます！