React Reduxの概要
※読みやすさ重視でRedux Essentials, Part 1: Redux Overview and Concepts | Reduxをところどころ意訳
概要
- ReduxのReact向けライブラリ
- ReduxとはJavascriptアプリのPredictable state container
- ここでいうPredictableの意味は、「コードを読んで何がしたいか予測できる」であると思われる(Predictable Code | Coding With Sam)
- グローバルな状態管理を行う場所を作り、コードの可読性を上げるためのもの
- Immutability(調査中)
- ReduxとはJavascriptアプリのPredictable state container
重要な概念
- Actions
type
というフィールドを持つJavascriptのオブジェクト(以降、actionオブジェクト)type
フィールドの値は"domain/eventName"
の形式の文字列を設定する
(例)const addTodoAvtion = {type: "todos/todoAdded", payload: ""}
- アプリで起こるイベント
- 基本的に次のAction Creatorsを使うため、actionオブジェクトを変数定義することはない
- Action Creators
- actionオブジェクトを返す関数
- Reducers
- 現在の
state
とactionオブジェクトを受け取り、state
を更新、新しいstate
を返す関数 - 受け取ったactionオブジェクトに基づいてイベントを起こすイベントリスナー的な役割
- ルール
- 新しい
state
が何かを計算するのみの機能を持つ - 現在の
state
の値を変更しない(現在のstate
の値をコピーして使うのは可) - 基本的に下記の形で使う。非同期処理、ランダム数を扱うなど、ややこしいことをしない。
const initialState = { value: 0 }
function counterReducer(state = initialState, action) {
// Check to see if the reducer cares about this action
if (action.type === 'counter/increment') {
// If so, make a copy of state
return {
...state,
// and update the copy with the new value
value: state.value + 1
}
}
// otherwise return the existing state unchanged
return state
}
- 新しい
- 現在の
- Store
state
を含むオブジェクトconfigureStore
モジュールをimportして、Reducerを設定するimport { configureStore } from '@reduxjs/toolkit'
const store = configureStore({ reducer: counterReducer })
- Dispatch
- Storeオブジェクトのメソッド
state
変更時したいときはDispatchを呼び出す(イベントトリガー的な役割)- actionオブジェクトの
type
を渡すことで、Reducerを起動する
例:store.dispatch({ type: 'counter/increment' })
- actionオブジェクトの
- Selectors
state
オブジェクトの特定の値を取得する関数(どの値を取得するかを関数宣言時に記述する)
例:const selectCounterValue = state => state.value
- 上記の場合、下記のように呼び出す
currentValue = selectCounterValue(store.getState())
- 上記の場合、下記のように呼び出す
その他の専門用語(調査中)
- Thunk
- Slice
ReduxのData flow
- 初期セットアップ
- rootとなるReducerでStoreを作成
- StoreがReducerを呼び、初期
state
を保存 - UIが描画されるとき、UIコンポーネントはStoreの
state
に応じてレンダリングされる - UIは
state
の変化に応じるようにしておく
state
更新state
が変化する動作(ボタンクリック等)があったとき、Storeに対して該当のActionsをDispatchする
例:dispatch({type: 'counter/increment'})
- StoreはReducerを実行し、新しい
state
を取得・UIへ通知 - UIは
state
に応じて再レンダリングされる
ディスカッション
コメント一覧
まだ、コメントがありません