[React]~Admin画面13:Reduxの導入~

こんにちは、KOUKIです。Reactで画面開発を行なっています。

前回は、Profileページの実装を行いました。今回は、Reduxを導入します。

尚、「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!

前回

事前準備

フォルダ/ファイル

モジュールのインストール

package.json

Reduxの導入

Reduxは、Reactアプリの状態を管理しやすくするためのフレームワークです。

例えば、本アプリでは、たくさんのPageやコンポーネントが存在します。

これらの間では、Propsなどを使ってデータの受け渡しを行い、状態管理を行なっていました。

しかし、開発規模が大きくなるとアプリケーションの状態を管理することが難しくなります。

「このデータはどこで変更してるんだっけ?」、「あれ、なんか変なデータが渡されている…!」みたいな感じになり、膨大なコードの海を漂って、頭をウンウンと捻らすことになります。

そこで、Reduxを使って、状態を一元管理できるようにしましょう。

Reduxを理解するには、次の3つのキーワードを知ることが必要です。

  1. State
  2. Action
  3. Reducer

Reactのコンポーネントは、内部に状態を持つことができます。これをStateと呼びます。Propsは、親のコンポーネントから値を渡されるものですが、 Stateはそのコンポーネント内部からのみ使用されます。Propsは、不変の値、Stateは可変の値です。

Actionは、アプリケーションの中で何が起きたのかを管理するためのものです。どんなアクションなのかを示すtypeとそれに紐づくユニークな値を持ちます。

Reducerは、actionが発動したとき、そのactionに組み込まれているtypeに応じて、状態(state)をどう変化させるのかを定義します。

Actionの実装

最初に、Actionを実装しましょう。

「SET_USER」というのが、typeであり、アクションです。「ユーザーをセットしますよ」という意味です。

型として使用しているUserProps(User)は、以前実装したInterfaceをClassに変換したものです。

「Props」が付いているのがいけていませんが、ひとまず、このまま実装します。

Reducer

次に、Reducerを実装します。

initialStateは、その名の通り、Userデータの初期値です。

APIからデータを取得した時は、SET_USERアクションを使って、User情報をStateに持たせることになります。

Configureの作成

自作のReducerは、reduxのcreateStore関数を使って、登録する必要があります。

Providerの実装

最後に、先ほど作成したStoreをアプリケーション内で使用できるようにするために、Providerを利用します。

LayoutコンポーネントをReduxに登録

LayoutコンポーネントをRedux(Store)に登録するため、Connect処理を実装します。

connecに、StateとDispatchを登録することで、以下のaliasが登録されるようです。

Layoutは、全てのコンポーネントを囲っている親コンポーネントです。ここに、StateとDispatchの初期値を定義することで、子コンポーネントにPropsを渡せるようになります。

例えば、NavコンポーネントをRedux Storeに登録し、Propsを渡す例を以下に記載します。

このようにすると、User情報をRedux Storeから取り出すようになるので、LayoutからPropsを渡す必要がなくなります。

ちょっと難しいかもしれませんね^^;

実装に問題がないか確認するために、ブラウザから「http://localhost:3000/」へアクセスし、User名が表示されているか確認します。

ページのナビゲーションに、「test test」が表示されているので、OKですね。

Profileコンポーネントのリファクタリング

ProfileコンポーネントもRedux Storeにコネクトしましょう。

Profileコンポーネントは、User APIへユーザー情報を取得し(useEffect)、その値をFormの値として設定していました。

しかし、Layoutコンポーネントがユーザー情報を取得し、Redux Storeを介して子コンポーネントに伝搬することが可能になったので、APIへのアクセスは不要になります。

ブラウザから「http://localhost:3000/profile」へアクセスし、挙動確認をしてみましょう。

「First Name」、「Last Name」、「Email」それぞれの項目に値が入っているので、問題なく処理ができています 。

Profile更新不具合の修正

先ほどリファクタリングしたProfileコンポーネントには、一つ問題があります。

ユーザー情報を更新し、「SUBMIT」ボタンを押下しても、ユーザー名の表示が変わらないのです。

例えば、First Nameを「test2」にして、「SUBMIT」ボタンを押下してみます。

上記の画像は、SUBMIT後なのですが、ナビゲーションにあるUser名に変更はありません。

もちろん、画面を読み込み直すと更新されます。

この不具合を修正したいと思います。

connectにdispatchを追加して、infoSubmit関数でAPIを呼び出し後にdispatchを実行しました。これで、Stateの状態が変わるので、画面が更新されるはずです。

OKですね。

次回

Adminページの実装は、以上です。

次回から、Ambassadorページの実装に入ります。

Reactまとめ

参考書籍


ソースコード

ここまで実装したソースコードを下記に記載します。

setUserAction.ts

setUserReducer.ts

configureStore.ts

src/index.tsx

user.ts

Profile.tsx

Layout.tsx

Nav.tsx

コメントを残す