搜尋
首頁web前端js教程完整的 redux 工具包(部分 -

Complete redux toolkit (Part -

第三部分:RTK查詢簡介

在這部分我們將介紹 RTK 查詢

1。什麼是RTK查詢?

雖然 Redux Toolkit 提供了強大的工具來管理狀態和非同步邏輯,但它仍然需要大量的樣板程式碼來處理資料擷取和快取。 RTK Query,在 Redux Toolkit v1.6 中引入,旨在透過提供一組強大的工具來解決這個問題,以最少的設定實現高效的資料擷取和快取。

RTK 查詢的主要功能:

  • 資料取得與快取:自動處理快取、失效和重新取得。
  • 樂觀更新與即時同步:輕鬆管理樂觀更新和即時資料同步。
  • 聲明式和簡單的 API: 直覺的 API 設計,具有最少的樣板程式碼。
  • 與 Redux Toolkit 整合:建構在 Redux Toolkit 之上,允許無縫整合。

2. 設定RTK查詢

要開始使用 RTK 查詢,我們需要定義一個 API 服務,指定如何取得資料以及哪些端點可用。讓我們使用簡單的帖子 API 來建立一個範例。

第 1 步:定義 API 服務

在 features/posts 目錄中建立一個名為 postsApi.js 的新檔案。該文件將定義用於獲取和修改帖子的 API 端點。

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

// Define an API service using RTK Query
export const postsApi = createApi({
  reducerPath: 'postsApi',
  baseQuery: fetchBaseQuery({ baseUrl: 'https://jsonplaceholder.typicode.com/' }),
  endpoints: (builder) => ({
    fetchPosts: builder.query({
      query: () => 'posts',
    }),
    addPost: builder.mutation({
      query: (newPost) => ({
        url: 'posts',
        method: 'POST',
        body: newPost,
      }),
    }),
  }),
});

// Export hooks for usage in functional components
export const { useFetchPostsQuery, useAddPostMutation } = postsApi;

說明:

  • createApi:此函數用於定義API服務。它會產生一個 API 切片,自動為您管理 store、reducers 和 actions。
  • baseQuery:定義 API 基本 URL 的函式。 fetchBaseQuery 是標準 fetch API 的輕量級包裝器。
  • 端點:定義 API 端點的函數。我們在這裡定義兩個端點:用於查詢資料的 fetchPosts 和用於建立新貼文的 addPost。

步驟2:將API服務整合到Redux Store中

將 postsApi 減速器新增至儲存空間並配置中間件以啟用快取和失效。

更新 store.js 以整合 postsApi:

// src/app/store.js
import { configureStore } from '@reduxjs/toolkit';
import { postsApi } from '../features/posts/postsApi';

const store = configureStore({
  reducer: {
    // Add the generated reducer as a specific top-level slice
    [postsApi.reducerPath]: postsApi.reducer,
  },
  // Adding the api middleware enables caching, invalidation, polling, and other features of RTK Query
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(postsApi.middleware),
});

export default store;

3. 在組件中使用RTK查詢

RTK 查詢根據 API 服務中定義的端點產生自訂掛鉤。這些鉤子用於自動執行資料擷取、突變和管理快取。

第 1 步:使用 useFetchPostsQuery 取得數據

建立一個 PostsList.js 元件來取得並顯示貼文清單。

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

const PostsList = () => {
  const { data: posts, error, isLoading } = useFetchPostsQuery();

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

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

export default PostsList;

說明:

  • useFetchPostsQuery:RTK 查詢為 fetchPosts 端點產生的自訂掛鉤。它會傳回一個對象,其中包含所取得的資料(data)、載入狀態(isLoading)和錯誤狀態(error)。
  • 元件根據鉤子輸出有條件地渲染載入、錯誤或資料狀態。

步驟 2:使用 useAddPostMutation 新增數據

建立一個 AddPostForm.js 元件以使用 addPost 突變新增貼文。

// src/features/posts/AddPostForm.js
import React, { useState } from 'react';
import { useAddPostMutation } from './postsApi';

const AddPostForm = () => {
  const [addPost, { isLoading }] = useAddPostMutation();
  const [title, setTitle] = useState('');
  const [content, setContent] = useState('');

  const handleSubmit = async (e) => {
    e.preventDefault();
    if (title && content) {
      await addPost({ title, body: content }).unwrap();
      setTitle('');
      setContent('');
    }
  };

  return (
    <section>
      <h2 id="Add-a-New-Post">Add a New Post</h2>
      <form onsubmit="{handleSubmit}">
        <input type="text" value="{title}" onchange="{(e)"> setTitle(e.target.value)}
          placeholder="Post Title"
        />
        <textarea value="{content}" onchange="{(e)"> setContent(e.target.value)}
          placeholder="Post Content"
        />
        <button type="submit" disabled>
          {isLoading ? 'Adding...' : 'Add Post'}
        </button>
      </textarea>
</form>
    </section>
  );
};

export default AddPostForm;

說明:

  • useAddPostMutation:RTK 查詢為 addPost 突變產生的自訂掛鉤。它提供了一個函數(addPost)來觸發突變和一個載入狀態(isLoading)。
  • unwrap():允許我們從突變中解開已解析或拒絕的有效負載,以處理請求後的副作用。

4. 處理快取、錯誤和樂觀更新

RTK Query 會自動處理快取、錯誤狀態,並在發生突變時使快取失效。您可以使用標籤和其他配置進一步自訂行為。

步驟1:使用providesTags和invalidatesTags

修改 postsApi 以使用標籤進行快取失效:

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

export const postsApi = createApi({
  reducerPath: 'postsApi',
  baseQuery: fetchBaseQuery({ baseUrl: 'https://jsonplaceholder.typicode.com/' }),
  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;

說明:

  • ProvidesTags:用於標記從 fetchPosts 查詢取得的資料。它有助於在添加新資料時有效地使快取失效。
  • invalidatesTags:這在 addPost 突變中使用,以使快取無效並重新獲取更新的資料。

5. 結論與後續步驟

在這一部分中,我們探索如何使用 RTK Query 來處理 Redux 應用程式中的資料擷取和快取。我們介紹了設定 API 服務、定義端點以及使用產生的掛鉤來查詢和變更資料。 RTK 查詢以最少的程式碼簡化了資料擷取和狀態管理,使其成為現代 Redux 應用程式的強大工具。

In the next part, we'll dive into Advanced Topics in RTK Query, such as customizing queries, using baseQuery, handling authentication, and optimizing performance.

Stay tuned for Part 4: Advanced Topics in RTK Query!

以上是完整的 redux 工具包(部分 -的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

jQuery檢查日期是否有效jQuery檢查日期是否有效Mar 01, 2025 am 08:51 AM

簡單JavaScript函數用於檢查日期是否有效。 function isValidDate(s) { var bits = s.split('/'); var d = new Date(bits[2] '/' bits[1] '/' bits[0]); return !!(d && (d.getMonth() 1) == bits[1] && d.getDate() == Number(bits[0])); } //測試 var

jQuery獲取元素填充/保證金jQuery獲取元素填充/保證金Mar 01, 2025 am 08:53 AM

本文探討如何使用 jQuery 獲取和設置 DOM 元素的內邊距和外邊距值,特別是元素外邊距和內邊距的具體位置。雖然可以使用 CSS 設置元素的內邊距和外邊距,但獲取準確的值可能會比較棘手。 // 設定 $("div.header").css("margin","10px"); $("div.header").css("padding","10px"); 你可能會認為這段代碼很

10個jQuery手風琴選項卡10個jQuery手風琴選項卡Mar 01, 2025 am 01:34 AM

本文探討了十個特殊的jQuery選項卡和手風琴。 選項卡和手風琴之間的關鍵區別在於其內容面板的顯示和隱藏方式。讓我們深入研究這十個示例。 相關文章:10個jQuery選項卡插件

10值得檢查jQuery插件10值得檢查jQuery插件Mar 01, 2025 am 01:29 AM

發現十個傑出的jQuery插件,以提升您的網站的活力和視覺吸引力!這個精選的收藏品提供了不同的功能,從圖像動畫到交互式畫廊。讓我們探索這些強大的工具:相關文章:1

HTTP與節點和HTTP-Console調試HTTP與節點和HTTP-Console調試Mar 01, 2025 am 01:37 AM

HTTP-Console是一個節點模塊,可為您提供用於執行HTTP命令的命令行接口。不管您是否針對Web服務器,Web Serv

自定義Google搜索API設置教程自定義Google搜索API設置教程Mar 04, 2025 am 01:06 AM

本教程向您展示瞭如何將自定義的Google搜索API集成到您的博客或網站中,提供了比標準WordPress主題搜索功能更精緻的搜索體驗。 令人驚訝的是簡單!您將能夠將搜索限制為Y

jQuery添加捲軸到DivjQuery添加捲軸到DivMar 01, 2025 am 01:30 AM

當div內容超出容器元素區域時,以下jQuery代碼片段可用於添加滾動條。 (無演示,請直接複製到Firebug中) //D = document //W = window //$ = jQuery var contentArea = $(this), wintop = contentArea.scrollTop(), docheight = $(D).height(), winheight = $(W).height(), divheight = $('#c

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具