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に応じて再レンダリングされる



ディスカッション
コメント一覧
まだ、コメントがありません