在這部分我們將介紹 RTK 查詢
1。什麼是RTK查詢?
雖然 Redux Toolkit 提供了強大的工具來管理狀態和非同步邏輯,但它仍然需要大量的樣板程式碼來處理資料擷取和快取。 RTK Query,在 Redux Toolkit v1.6 中引入,旨在透過提供一組強大的工具來解決這個問題,以最少的設定實現高效的資料擷取和快取。
RTK 查詢的主要功能:
要開始使用 RTK 查詢,我們需要定義一個 API 服務,指定如何取得資料以及哪些端點可用。讓我們使用簡單的帖子 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;
說明:
將 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;
RTK 查詢根據 API 服務中定義的端點產生自訂掛鉤。這些鉤子用於自動執行資料擷取、突變和管理快取。
建立一個 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>Posts</h2> <ul> {posts.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> </section> ); }; export default PostsList;
說明:
建立一個 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>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}> {isLoading ? 'Adding...' : 'Add Post'} </button> </form> </section> ); }; export default AddPostForm;
說明:
RTK Query 會自動處理快取、錯誤狀態,並在發生突變時使快取失效。您可以使用標籤和其他配置進一步自訂行為。
修改 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;
說明:
在這一部分中,我們探索如何使用 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中文網其他相關文章!