// createApi를 import하기위해 React 엔트리 포인트 사용
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { Pokemon } from './types'
// base URL과 엔드포인트들로 서비스 정의
export const pokemonApi = createApi({
reducerPath: 'pokemonApi',
baseQuery: fetchBaseQuery({ baseUrl: 'https://pokeapi.co/api/v2/' }),
endpoints: (builder) => ({
getPokemonByName: builder.query<Pokemon, string>({
query: (name) => `pokemon/${name}`,
}),
}),
})
// 정의된 엔드포인트에서 자동으로 생성된 훅을 함수형 컴포넌트에서 사용하기 위해 export
export const { useGetPokemonByNameQuery } = pokemonApi
// Or from '@reduxjs/toolkit/query/react'
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query'
import { Post } from './types'
const api = createApi({
baseQuery: fetchBaseQuery({
baseUrl: '/',
}),
tagTypes: ['Post'],
endpoints: (build) => ({
getPost: build.query<Post, number>({
// 노트: `queryFn`을 `query`자리에 사용할 수도 있습니다.
query: (id) => ({ url: `post/${id}` }),
// data를 가져와서 hook이나 selector에서 중첩된 프로퍼티를 방지합니다.
transformResponse: (response: { data: Post }) => response.data,
providesTags: (result, error, id) => [{ type: 'Post', id }],
// 2번째 파라미터는 구조분해된 `QueryLifecycleApi`입니다.
async onQueryStarted(
arg,
{
dispatch,
getState,
extra,
requestId,
queryFulfilled,
getCacheEntry,
updateCachedData,
}
) {},
// 2번째 파라미터는 구조분해된 `QueryCacheLifecycleApi`입니다.
async onCacheEntryAdded(
arg,
{
dispatch,
getState,
extra,
requestId,
cacheEntryRemoved,
cacheDataLoaded,
getCacheEntry,
updateCachedData,
}
) {},
}),
}),
})
리액트 hooks를 사용한다면 RTK Query는 추가적인 기능을 제공한다. 가장 큰 이점은 hooks을 통해 백그라운드 패칭에 대한 불리언 값을 손쉽게 사용할 수 있다.
hooks는 서비스의 endpoint에서 자동으로 생성된다.
getPost: builder.query() 엔드포인트는 useGetPostQuery hook을 생성한다.
다음과 같은 5개의 쿼리와 관련된 hooks이 있다:
useQuerySubscription과 useQueryState를 구성하는 기본 hook. 엔드포인트에서 자동으로 데이터를 패치하고, 캐시된 데이터를 컴포넌트에 구독하며, 리덕스 스토어에서 요청 상태와 캐시된 데이터를 가져온다.
refetch 함수를 반환하고 모든 hook 옵션을 받는다. 엔드포인트에서 자동으로 데이터를 패치하고 컴포넌트에 캐시된 데이터를 구독한다.
쿼리 상태를 반환하고 skip과 selectFromResult를 받는다. 리덕스 스토어에서는 요청 상태와 캐시된 데이터를 읽는다.
fetch 함수, 쿼리 결과, 마지막 promise 정보가 포함된 튜플을 반환한다. useQuery와 비슷하지만 언제 데이터 패칭을 하는지 수동으로 제어한다.
fetch 함수와 마지막 promise 정보가 있는 튜플을 반환한다. useQuerySubscription과 비슷하지만 언제 데이터 패칭을 하는지 수동으로 제어한다.
예시에서는 useGetPostQuery같은 표준 useQuery 기반 hooks를 사용한다. 그러나 다른 hooks들도 특정한 사례에 사용할 수 있다.
참고 : https://junsangyu.gitbook.io/rtk-query/rtk-query/queries