4부: RTK 쿼리의 고급 주제.
이 부분에서는 쿼리 사용자 정의, 인증 처리, 낙관적 업데이트, 성능 최적화를 포함하여 RTK 쿼리의 고급 기능과 사용 사례에 중점을 둘 것입니다.
이전 부분에서는 RTK 쿼리를 사용하여 데이터를 가져오고 변형하는 기본 사항을 다루었습니다. 이제 RTK 쿼리를 더욱 강력하게 만드는 고급 기능을 자세히 살펴보겠습니다. 이러한 기능을 사용하면 쿼리를 사용자 정의하고, 인증을 관리하고, 성능을 최적화하고, 보다 원활한 사용자 경험을 위한 낙관적 업데이트를 처리할 수 있습니다.
인증이 필요한 API로 작업할 때는 JWT 토큰이나 API 키와 같은 인증 헤더를 포함하도록 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;
설명:
맞춤형 baseQuery를 사용하도록 postApi.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;
낙관적 업데이트를 사용하면 서버가 변형을 확인하기 전에 즉시 UI를 업데이트하여 보다 원활한 사용자 경험을 제공할 수 있습니다. 서버에서 오류가 반환되면 UI가 이전 상태로 되돌아갈 수 있습니다.
RTK 쿼리에서 제공하는 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 } }, }),
설명:
때때로 하나의 쿼리가 다른 쿼리의 결과에 종속되는 종속 쿼리를 수행해야 할 수도 있습니다. RTK 쿼리는 쿼리 실행 시기를 제어하기 위한 건너뛰기 매개변수를 제공합니다.
// 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;
설명:
RTK 쿼리는 지정된 간격으로 데이터를 최신 상태로 유지하기 위해 폴링을 지원합니다. 실시간 데이터 동기화에 유용합니다.
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;
설명:
RTK 쿼리는 쿼리 결과에서 특정 데이터를 선택할 수 있도록 하여 고급 성능 최적화를 위한 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;
설명:
이 부분에서는 인증을 위한 baseQuery 사용자 정의, 낙관적 업데이트 처리, 종속 쿼리 관리, 실시간 데이터 동기화를 위한 폴링 사용, selectFromResult를 통한 성능 최적화 등 RTK 쿼리의 고급 주제를 살펴보았습니다. RTK 쿼리의 풍부한 기능 세트는 최신 Redux 애플리케이션에서 데이터 가져오기 및 캐싱을 처리하기 위한 강력한 도구입니다.
다음 부분에서는 Redux 툴킷 및 RTK 쿼리에 대한 테스트 전략에 대해 논의하고, 강력하고 유지 관리 가능한 코드를 보장하기 위한 단위 테스트, 통합 테스트 및 모범 사례를 다룹니다.
파트 5: Redux 툴킷 및 RTK 쿼리에 대한 테스트 전략을 계속 지켜봐 주시기 바랍니다!
위 내용은 완전한 redux 툴킷(파트 - 4)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!