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は時間(年、月、日)フィールドを変更されていない時間、分、秒に置き換えます。分析例

推薦する

Iframe Web ページのナビゲーション ウィンドウに関する簡単な説明

Iframe Web ページのナビゲーション ウィンドウに関する簡単な説明 Iframe ウェブペー...

MySQLデータ移行の概要

目次序文: 1. データ移行について2. 移行計画と留意点要約:序文:日常業務では、テーブル、データ...

Ajax jQueryはページ上のdivの更新効果を実現します

元のコードは次のとおりです。 <div class='コントロールグループ'&...

パーティショニングを使用して数十億のデータに対する MySQL データ処理を最適化する方法

MySQL が数千万のデータをクエリする場合、ほとんどのクエリ最適化の問題はインデックスを通じて解決...

MySQLループは数千万のデータを挿入する

1. テストテーブルを作成する テーブル `mysql_genarate` を作成します ( `id...

SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決策

目次ブラウザ同一生成元ポリシー1. VUEフロントエンド構成プロキシはクロスドメインの問題を解決しま...

MySQLユーザーと権限管理の詳細な説明

この記事では、例を使用して MySQL ユーザーと権限の管理について説明します。ご参考までに、詳細は...

CSS カウンターを使用して数字の順序付きリストを美しく表示する方法

Web デザインでは、Web サイトに表示されるデータの構造とコンテンツをユーザーが明確に理解できる...

HTML ユーザー登録ページ設定ソースコード

上記の Web ページをデザインします。 <!DOCTYPE html> <htm...

Docker コンテナに TensorRT をインストールする際の問題

Ubuntu にインストールされているバージョンをアンインストールします。 sudo apt-get...

Reactはconetxtを通じてマルチコンポーネント値転送関数を実装します

この関数の効果はvue的provide/injectに似ています。 contextを通じて反応できる...

js Promise同時制御メソッド

目次質問背景アイデアと実装質問次のように、同時実行 Promise の数を制御するメソッドを記述する...

ハイパーリンクAタグを学ぶ

聞く: CSS を使用してハイパーリンクのスタイルを設定しましたが、ホバーしても機能しません。なぜこ...

Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

序文Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上さ...

Linux の圧縮および解凍コマンドの紹介

目次一般的な圧縮形式: gz .bz2 .xz .zip一般的に使用されるアーカイブは圧縮を必要とす...