ホームページ ウェブフロントエンド jsチュートリアル 完全な redux ツールキット (パート - 4)

完全な redux ツールキット (パート - 4)

Sep 11, 2024 pm 02:32 PM

Complete redux toolkit (Part - 4)

パート 4: RTK クエリの高度なトピック

このパートでは、クエリのカスタマイズ、認証の処理、楽観的更新、パフォーマンスの最適化など、RTK クエリの高度な機能とユースケースに焦点を当てます。

パート 4: RTK クエリの高度なトピック

1. 高度な RTK クエリの概念の概要

前のパートでは、RTK クエリを使用してデータのフェッチと変更を行う基本について説明しました。次に、RTK クエリをさらに強力にする、より高度な機能について詳しく説明します。これらの機能により、クエリのカスタマイズ、認証の管理、パフォーマンスの最適化、楽観的な更新の処理が可能になり、よりスムーズなユーザー エクスペリエンスを実現します。

2. 認証用のbaseQueryのカスタマイズ

認証が必要な API を使用する場合は、JWT トークンや API キーなどの認証ヘッダーを含めるように BaseQuery をカスタマイズする必要があります。

ステップ 1: カスタム BaseQuery を作成する

すべてのリクエストに認証ヘッダーを追加するカスタムの BaseQuery 関数を作成できます。

// src/app/customBaseQuery.js
import { fetchBaseQuery } from '@reduxjs/toolkit/query/react';

const customBaseQuery = fetchBaseQuery({
  baseUrl: 'https://jsonplaceholder.typicode.com/',
  prepareHeaders: (headers, { getState }) => {
    const token = getState().auth.token; // Assuming auth slice has token
    if (token) {
      headers.set('Authorization', `Bearer ${token}`);
    }
    return headers;
  },
});

export default customBaseQuery;
ログイン後にコピー

説明:

  • prepareHeaders: この関数を使用すると、各リクエストのヘッダーをカスタマイズできます。 Redux ストアからトークンを取得し、それを Authorization ヘッダーに添付します。

ステップ2: createApiでカスタムbaseQueryを使用する

カスタムのbaseQueryを使用するようにpostsApi.jsファイルを変更します:

// src/features/posts/postsApi.js
import { createApi } from '@reduxjs/toolkit/query/react';
import customBaseQuery from '../../app/customBaseQuery';

export const postsApi = createApi({
  reducerPath: 'postsApi',
  baseQuery: customBaseQuery, // Use the custom base query here
  tagTypes: ['Post'],
  endpoints: (builder) => ({
    fetchPosts: builder.query({
      query: () => 'posts',
      providesTags: (result) =>
        result ? result.map(({ id }) => ({ type: 'Post', id })) : ['Post'],
    }),
    addPost: builder.mutation({
      query: (newPost) => ({
        url: 'posts',
        method: 'POST',
        body: newPost,
      }),
      invalidatesTags: ['Post'],
    }),
  }),
});

export const { useFetchPostsQuery, useAddPostMutation } = postsApi;
ログイン後にコピー

3. RTK クエリによる楽観的な更新

オプティミスティック更新により、サーバーが変更を確認する前に UI を即座に更新できるため、よりスムーズなユーザー エクスペリエンスが提供されます。サーバーがエラーを返した場合、UI は前の状態に戻ることができます。

ステップ 1: ミューテーションに楽観的な更新を実装する

RTK Query が提供する onQueryStarted ライフサイクル メソッドを使用して、オプティミスティックな更新を実装できます。

// src/features/posts/postsApi.js
addPost: builder.mutation({
  query: (newPost) => ({
    url: 'posts',
    method: 'POST',
    body: newPost,
  }),
  invalidatesTags: ['Post'],
  onQueryStarted: async (newPost, { dispatch, queryFulfilled }) => {
    // Optimistic update: immediately add the new post to the cache
    const patchResult = dispatch(
      postsApi.util.updateQueryData('fetchPosts', undefined, (draftPosts) => {
        draftPosts.push({ id: Date.now(), ...newPost }); // Fake ID for optimistic update
      })
    );
    try {
      await queryFulfilled; // Await server response
    } catch {
      patchResult.undo(); // Revert if the mutation fails
    }
  },
}),
ログイン後にコピー

説明:

  • onQueryStarted: このライフサイクル メソッドは、ミューテーションの開始時にトリガーされます。キャッシュの更新を管理するために、dispatch パラメーターと queryFulfilled パラメーターが提供されます。
  • PostsApi.util.updateQueryData: このユーティリティ関数を使用すると、キャッシュされたデータを楽観的に更新できます。
  • patchResult.undo(): サーバーがエラーを返した場合、オプティミスティック更新を元に戻します。

4. 依存クエリの処理

場合によっては、あるクエリが別のクエリの結果に依存する、依存クエリの実行が必要になることがあります。 RTK クエリは、クエリの実行時期を制御するスキップ パラメーターを提供します。

例: 選択した投稿 ID に基づいて投稿の詳細を取得する

// src/features/posts/PostDetails.js
import React from 'react';
import { useFetchPostQuery } from './postsApi';

const PostDetails = ({ postId }) => {
  const { data: post, error, isLoading } = useFetchPostQuery(postId, { skip: !postId });

  if (!postId) return <p>Select a post to view details.</p>;
  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>Error loading post details.</p>;

  return (
    <div>
      <h3>{post.title}</h3>
      <p>{post.body}</p>
    </div>
  );
};

export default PostDetails;
ログイン後にコピー

説明:

  • useFetchPostQuery: postId を引数として受け取るクエリ フック。 postId が指定されていない場合、クエリは { Skip: !postId } を使用してスキップされます。

5. RTK クエリによるポーリングとリアルタイム データ

RTK クエリは、指定された間隔でデータを最新の状態に保つためのポーリングをサポートしています。これは、リアルタイムのデータ同期に役立ちます。

ステップ 1: クエリでポーリングを使用する

pollingInterval オプションを使用して、任意のクエリのポーリングを有効にできます。

// src/features/posts/PostsList.js
import React from 'react';
import { useFetchPostsQuery } from './postsApi';

const PostsList = () => {
  const { data: posts, error, isLoading } = useFetchPostsQuery(undefined, {
    pollingInterval: 30000, // Poll every 30 seconds
  });

  if (isLoading) return <p>Loading...</p>;
  if (error) return <p>An error occurred: {error.message}</p>;

  return (
    <section>
      <h2>Posts</h2>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
    </section>
  );
};

export default PostsList;
ログイン後にコピー

説明:

  • pollingInterval: このオプションは、クエリがサーバーに新しいデータをポーリングする間隔 (ミリ秒単位) を指定します。

6. selectFromResult によるパフォーマンスの最適化

RTK クエリには、クエリ結果から特定のデータを選択できるようにすることで、高度なパフォーマンスの最適化のための selectFromResult オプションが用意されています。

ステップ 1: selectFromResult を使用して再レンダリングを最適化する

selectFromResult オプションを使用すると、クエリ結果のサブセットのみが必要な場合に不必要な再レンダリングを防ぐことができます。

// src/features/posts/PostTitleList.js
import React from 'react';
import { useFetchPostsQuery } from './postsApi';

const PostTitleList = () => {
  const { data: posts } = useFetchPostsQuery(undefined, {
    selectFromResult: ({ data }) => ({ titles: data?.map((post) => post.title) }),
  });

  return (
    <section>
      <h2>Post Titles</h2>
      <ul>
        {posts?.map((title, index) => (
          <li key={index}>{title}</li>
        ))}
      </ul>
    </section>
  );
};

export default PostTitleList;
ログイン後にコピー

説明:

  • selectFromResult: このオプションを使用すると、取得した投稿からタイトルのみを選択でき、クエリ結果の他のデータが変更された場合に不要な再レンダリングを防ぐことができます。

7. 結論と次のステップ

このパートでは、認証のための BaseQuery のカスタマイズ、オプティミスティック更新の処理、依存クエリの管理、リアルタイム データ同期のためのポーリングの使用、selectFromResult によるパフォーマンスの最適化など、RTK クエリの高度なトピックについて説明しました。 RTK クエリの豊富な機能セットにより、最新の Redux アプリケーションでデータのフェッチとキャッシュを処理するための強力なツールになります。

次のパートでは、Redux Toolkit と RTK クエリのテスト戦略について説明し、単体テスト、統合テスト、堅牢で保守可能なコードを確保するためのベスト プラクティスについて説明します。

パート 5: Redux ツールキットと RTK クエリのテスト戦略 をお楽しみに!

以上が完全な redux ツールキット (パート - 4)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptエンジン:実装の比較 JavaScriptエンジン:実装の比較 Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへ:すべてがどのように機能するか C/CからJavaScriptへ:すべてがどのように機能するか Apr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

See all articles