Redux Toolkit で Redux を簡素化する方法

Redux Toolkit で Redux を簡素化する方法

効率的な Redux 開発のための実績のあるツールセットである Redux Toolkit について学びましょう。この記事では、Redux Toolkit が React コミュニティからさらに注目されるに値する理由を説明します。

React と Redux は、大規模な React アプリケーションで状態を管理するための最適な組み合わせと考えられています。しかし、時間の経過とともに、Redux の人気は次の理由で低下しました。

  • Redux Store の設定は簡単ではありません。
  • Redux を React で動作させるには、いくつかのパッケージが必要です。
  • Redux では定型コードが多すぎます。

これらの疑問に対して、Redux の作成者である Dan Abramov 氏は、「Redux は必要ないかもしれない」というタイトルの記事を公開し、必要な場合にのみ Redux を使用し、それほど複雑でないアプリケーションを開発する場合は他の方法に従うことを提案しました。

Redux Toolkitが解決する問題

Redux Toolkit (旧称 Redux Starter Kit) は、グローバル ストアを構成し、Redux API を可能な限り抽象化することでアクションとリデューサーの作成をより効率的にするためのオプションを提供します。

何が含まれていますか?

Redux Toolkit には、Immer、Redux-Thunk、Reselect などの便利なパッケージが付属しています。これにより、React 開発者の作業が大幅に楽になり、状態を直接変更したり (不変性を処理せずに)、Thunk などのミドルウェアを適用したり (非同期操作を処理) できるようになります。また、リデューサー機能を簡素化するために、Redux 用のシンプルな「セレクター」ライブラリである Reselect も使用します。

Redux Toolkit API の主な機能は何ですか?

以下は、既存の Redux API 関数を抽象化した Redux Took Kit で使用される API 関数です。これらの関数は Redux フローを変更するものではなく、より読みやすく管理しやすいように簡素化するだけです。

  • configureStore: Redux の元の createStore と同じように Redux ストア インスタンスを作成しますが、名前付きオプション オブジェクトを受け入れ、Redux DevTools 拡張機能を自動的に設定します。
  • createAction: アクション タイプの文字列を受け入れ、そのタイプを使用するアクション作成関数を返します。
  • createReducer: 初期状態値とアクション タイプのルックアップ テーブルをリデューサー関数に受け入れ、すべてのアクション タイプを処理するリデューサーを作成します。
  • createSlice: 初期状態と、リデューサー名と関数を含むルックアップ テーブルを受け入れ、アクション クリエーター関数、アクション タイプ文字列、およびリデューサー関数を自動的に生成します。

上記の API を使用すると、特に createAction メソッドと createReducer メソッドを使用して、Redux の定型コードを簡素化できます。ただし、アクション クリエーターとリデューサー関数を自動的に生成する createSlice を使用すると、これをさらに簡略化できます。

createSlice の特別な点は何ですか?

メモリスライスを生成するヘルパー関数です。スライスの名前、初期状態、およびリデューサー関数を受け入れて、リデューサー、アクション タイプ、およびアクション クリエーターを返します。

まず、従来の React-Redux アプリケーションでリデューサーとアクションがどのように見えるかを見てみましょう。

アクション

「../constant/constants」から {GET_USERS、CREATE_USER、DELETE_USER} をインポートします。
エクスポート const GetUsers = (データ) => (ディスパッチ) => {
 急送({
 タイプ: GET_USERS、
 ペイロード: データ、
 });
};
エクスポート const CreateUser = (データ) => (ディスパッチ) => {
 急送({
 タイプ: CREATE_USER、
 ペイロード: データ、
 });
};
エクスポート const DeleteUser = (データ) => (ディスパッチ) => {
 急送({
 タイプ: DELETE_USER、
 ペイロード: データ、
 });
};

減速機

「../constant/constants」から {GET_USERS、CREATE_USER、DELETE_USER} をインポートします。
定数初期状態 = {
 エラーメッセージ: "",
 読み込み中: false、
 ユーザー:[]
};
const UserReducer = (state = initialState, { ペイロード }) => {
スイッチ(タイプ){
 GET_USERSの場合:
 return { ...state、users: payload、loading: false };
CREATE_USERの場合:
 戻り値 { ...状態、ユーザー: [ペイロード、...状態.ユーザー]、
 読み込み中: false };
DELETE_USERの場合:
 戻り値 { ...状態、 
 ユーザー: state.users.filter((user) => user.id !== payload.id),
、読み込み中: false };
デフォルト:
 状態を返します。
 }
};
デフォルトの UserReducer をエクスポートします。

ここで、createSlice を使用して同じ機能を簡素化して実現する方法を見てみましょう。

'@reduxjs/toolkit' から createSlice をインポートします。
エクスポートconst初期状態= {
 ユーザー: [],
 読み込み中: false、
 エラー: 偽、
};
定数userSlice = createSlice({
 名前: 'ユーザー',
 初期状態、
 リデューサー: {
  getUser: (状態、アクション) => {
   アクションのペイロードをstate.usersに設定します。
   状態.loading = true;
   状態.エラー = false;
  },
  createUser: (状態、アクション) => {
   state.users.unshift(アクション.payload);
   状態.loading = false;
  },
  deleteUser: (状態、アクション) => {
   state.users.filter((user) => user.id !== action.payload.id);
   状態.loading = false;
  },
 },
});
エクスポート const { createUser、deleteUser、getUser } = userSlice.actions;
デフォルトの userSlice.reducer をエクスポートします。

ご覧のとおり、すべてのアクションとリデューサーが 1 つのシンプルな場所にまとめられています。従来の Redux アプリケーションでは、各アクションとそれに対応するリデューサーのアクションを管理する必要がありましたが、createSlice を使用する場合は、アクションを識別するために switch を使用する必要がありません。

一般的な Redux フローでは、状態の変更時にエラーが発生するため、これを克服するには、スプレッド演算子やオブジェクトの割り当てなどの特別な JavaScript 戦略が必要になります。 Redux Toolkit は Immer を使用するため、状態の変化について心配する必要はありません。スライスはアクションとリデューサーを作成するため、以下に示すように、アクションとリデューサー用に個別のファイルとディレクトリを作成しなくても、それらをエクスポートしてコンポーネントとストアで使用し、Redux を構成できます。

"@reduxjs/toolkit" から configureStore をインポートします。
「./features/user/userSlice」からuserSliceをインポートします。
エクスポートデフォルトconfigureStore({
 リデューサー: {
 ユーザー: userSlice、
 },
});

このストアは、useSelector と useDispatch を使用して、redux API 経由でコンポーネントから直接使用できます。操作を識別するために定数を使用したり、型を使用したりする必要はありません。

非同期Reduxフローの処理

非同期アクションを処理するために、Redux Toolkit は、文字列識別子とペイロード作成者コールバックを受け入れ、実際の非同期ロジックを実行し、返された Promise とリデューサーで処理できるアクション タイプに基づいて、関連付けられたアクションのディスパッチを処理する Promise を返す、createAsyncThunk と呼ばれる特別な API メソッドを提供します。

「axios」からaxiosをインポートします。
"@reduxjs/toolkit" から createAsyncThunk をインポートします。
エクスポートconst GetPosts = createAsyncThunk(
"post/getPosts"、async() => axios.get(`${BASE_URL}/posts`) を待機します
);
エクスポートconst CreatePost = createAsyncThunk(
"post/createPost"、async (post) => axios.post(`${BASE_URL}/post`、post) を待機します。
);

従来のデータ フローとは異なり、createAsyncThunk によって処理されるアクションは、シャード内の extraReducers セクションによって処理されます。

"@reduxjs/toolkit" から createSlice をインポートします。
「../../services」から { GetPosts、CreatePost } をインポートします。
エクスポートconst初期状態= {
 投稿: [],
 読み込み中: false、
 エラー: null、
};
エクスポートconst postSlice = createSlice({
名前: "投稿",
初期状態: 初期状態、
追加リデューサー: {
  [GetPosts.fulfilled]: (状態、アクション) => {
   アクションのペイロードデータを取得します。
  },
  [GetPosts.rejected]: (状態、アクション) => {
  状態.posts = [];
  },
  [CreatePost.fulfilled]: (状態、アクション) => {
  state.posts.unshift(アクション.ペイロード.データ);
  },
 },
});
デフォルトの postSlice.reducer をエクスポートします。

extraReducers 内では、満たされた状態と拒否された状態の両方を処理できることに注意してください。

これらのコード スニペットを使用すると、このツールキットが Redux のコードをいかに簡素化できるかがわかります。参考までに、Redux Toolkit を利用した REST の例を作成しました。

最後に

私の経験では、Redux を使い始める場合、Redux Toolkit は最適な選択肢です。コードを簡素化し、定型コードを削減することで Redux の状態を管理するのに役立ちます。

最後に、Redux と同様に、Redux Toolkit は React 専用に構築されているわけではありません。 Angular のような他のフレームワークでも使用できます。

詳細については、Redux Toolkit のドキュメントを参照してください。

読んでいただきありがとうございます!

上記は、Redux Toolkit を使用して Redux を簡素化する方法の詳細です。Redux Toolkit を使用して Redux を簡素化する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • React+Ant Design開発環境をセットアップするための実装手順
  • ViteでReactプロジェクトを構築する方法
  • 入力ボックスの値を取得する方法のReactの例
  • Reactはラジオコンポーネントのサンプルコードを実装します
  • React Contextの理解と応用についてお話ししましょう
  • Reactフック入門チュートリアル
  • React と Threejs を使用して VR パノラマ プロジェクトを作成する詳細なプロセス
  • React Routerの歴史について簡単に説明します
  • Reactはルーティングを使用してログインインターフェースにリダイレクトします

<<:  Hbase 入門

>>:  MYSQLは時間(年、月、日)フィールドを変更されていない時間、分、秒に置き換えます。分析例

推薦する

Vue コンポーネント化の一般的な方法: コンポーネント値の転送と通信

関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...

jsを使ってシンプルなディスククロックを実現する

この記事では、参考までに、シンプルなディスククロックを実装するためのjsの具体的なコードを紹介します...

HTML 縦列表示テキストを使用してテキストを縦列で表示します

コードをコピーコードは次のとおりです。 <span style='display:bl...

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

CSS を解析して画像のテーマカラー機能を抽出する (ヒント)

背景すべては、WeChat 技術グループのクラスメートが「写真の主な色を取得する方法はあるか」と尋ね...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

Vue+Elementバックグラウンド管理フレームワークの統合実践

目次Vue+ElementUI バックグラウンド管理フレームワークでは、ElementUI とは何で...

Nginx プロセス管理とリロードの原則の詳細な説明

プロセス構造図Nginx はマルチプロセス構造です。マルチプロセス構造は、次のような Nginx の...

JSが5つ星の賞賛を獲得

この記事では、5つ星の評価を獲得するためのJSの具体的なコードを参考までに共有します。具体的な内容は...

Windows10でのMySQL 5.7.21のインストールと設定のチュートリアル

この記事では、MySQL 5.7.21 のインストールと設定方法を記録し、皆様と共有します。 1. ...

MySQL 5.6 zipパッケージのインストールチュートリアルの詳細

これまでは、拡張子が .msi のファイル、つまり、完全なインストールが使用されていました。しかし、...

JavaScript モバイル H5 画像生成ソリューションの説明

現在、WeChatパブリックアカウントの運用活動が多く、写真を生成する必要があります。生成された写真...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

Linux デュアル ネットワーク カード バインディング スクリプト メソッドの例

Linux の操作と構成作業では、デュアル ネットワーク カードのバインディングがよく使用されます。...