- Reduxとは
- 参考サイト
- 素のReduxコードと公式画像を照らし合わせて理解する
- 最初にまとめ
- Store
- Reducer
- State
- UI
- Action
- type
- payload
- Dispatch
- EventHandler
- StoreとEventHandlerの繋ぎ
Reduxとは
状態を管理するライブラリ。
アプリケーション全体で状態を管理できるため、propsで渡す手間が省ける。
propsのバケツリレーを回避できる。
React以外でも使える。
参考サイト
素のReduxコードと公式画像を照らし合わせて理解する
素のReduxは非推奨。
実運用では、Redux tool kitを使うこと。
公式画像と照らし合わせながら見て理解を深めたい。
ファイルサイズ大きくて公式GIFを貼れなかったので下記を参照↓
Redux Fundamentals, Part 2: Concepts and Data Flow | Redux
最初にまとめ
- ボタンクリック(EventHandler起動)
dispatch(action{type:~, payload:~})
でActionをReducerに送信- typeを元にどのReducerを起動するか識別
- Reducerがpayloadを使ってStateを更新
- StateがUIに反映される
Store
状態を保管しておく場所。
StoreはStateとReducerを持つ。
createStore(Reducer);でStore全体を生成。
import { createStore } from "redux"; const initialState = 0; const reducer; //省略 export default createStore( // ここでStore生成 reducer );
Reducer
Reducerとはstateをどのように更新するか定義した関数。
createStore(Reducer);で引数にReducerを渡す。
そうするとStoreの中にReducerが作られる。Reducerは複数生成可能。
import { createStore } from "redux"; const initialState = 0; const reducer = (state = initialState, { type, payload }) => { //Reducerを定義 switch (type) { case "+": return state + payload ; case "-": return state - payload ; default: return state; } }; export default createStore( // ここでStore生成 reducer );
State
状態のこと。
状態とはWebアプリだと、ログイン状態やカート内商品の個数など。
StateはReducerと同じ数作られる。
Reduxは、このStateを管理するためのライブラリ。
useSelector()でStateを取り出す。
Stateが更新されると画面が再描画される。
import { useSelector } from "react-redux" const state = useSelector(state => state);//Stateの取得
UI
関数コンポーネントのこと。
useSlector();で更新後のStateを取得する。
Stateが更新されると、画面が再レンダリングされる。
Action
名前はActionだけど何のActionもしない。
Reducerの識別子である「tpye」と「payload(Stateの素)」を持つオブジェクト。
type識別子でReducer関数を特定 → payloadの値を使ってReducerがStateを更新する、という流れ。
ActionはDisptchの引数として、Reducerに渡される、Actionを元に実際にアクションするのはReducer。
import { useDispatch } from "react-redux"; const dispatch = useDispatch(); const eventHandler = () => { dispatch({ type: "+", payload: 1 }); // type(+ or -)でReducerのswitch文の分岐を判定。 // paylod(数値)を元にRducerがStateを更新。足し算引き算。 // typeとpayloadが含まれたオブジェクトをActionオブジェクトと言う }
type
Reducerを識別するための名前みたいなもの。
Reducerには1個1個この識別子が付いてる。
payload
本来の意味は
- 有料荷重(貨物のうちの有料ブ部分)
- 乗客と貨物の最大積載量
IT用語では、本来のデータ部分のこと。
HTTPで言うと、ヘッダデータなどの付加情報をを除いたボディ部分。
APIとの通信の場合、payloadにレスポンスデータが入ってくる。
太字部分↓
http://www.google.com?name="yamada"
ReduxではActionにpaylodが含まれていて、dispatch(action);でReducerを呼び出し、Reducerにpayloadが渡される。
Dispatch
ReducerにActionを渡して、Reducerを呼び出す関数。ここがスタート。
const dispatch = useDispatch();で生成。
dispatch(action);でdispatchの引数にAcitonオブジェクトを渡して実行する。
import { useDispatch } from "react-redux"; const CounterButton = ({type, payload}) => { const dispatch = useDispatch(); const eventHandler = () => { dispatch({ type, payload }); }
EventHandler
そのまま。
何らかのEventと紐付ける。ボタンクリックなど。
import { useDispatch } from "react-redux"; const eventHandler = () => { dispatch({ type, payload }); }
StoreとEventHandlerの繋ぎ
Dispatchの引数にActionオブジェクトを渡して繋ぐ。
ActionオブジェクトにはReducerの識別子であるtypeプロパティがある。
typeプロパティの値でReducerと紐付ける。
import { useDispatch } from "react-redux"; const eventHandler = () => { dispatch({ type, payload });//これ }