RTK 查询:一次转换所有查询响应
RTK Query: Transform all query responses at once
使用 RTK 查询,可以使用 transformResponse
转换端点的响应,如下所示:
import { apiSlice } from '../api/apiSlice'
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState()
import { camelizeKeys } from 'humps'
export const extendedApiSlice = apiSlice.injectEndpoints({
endpoints: builder => ({
getUsers: builder.query({
query: () => '/users',
transformResponse: (response) => camelizeKeys(response.data),
}),
// … 25 other endpoints
})
})
如果每个端点响应都需要以某种方式进行转换,例如通过 humps camelizeKeys
函数,这将很快变得非常重复。
推荐的 way/best 做法是什么(全局)为所有查询定义一个 transformResponse
(理想情况下是为所有突变定义另一个)?
我认为定义这种全局转换的最佳位置是自定义 baseQuery
:
export const baseQueryWithCamelize: BaseQueryFn<
string | FetchArgs,
unknown,
FetchBaseQueryError
> = async (args, api, extraOptions = {}) => {
const result = await baseQuery(args, api, extraOptions);
if (result.data) {
result.data = camelizeKeys(result.data as any);
}
return result;
};
那么你应该在 root 中使用它 api
def:
export default createApi({
baseQuery: baseQueryWithCamelize,
tagTypes: TAGS,
endpoints: (builder) => ({
healthcheck: builder.query<void, void>({
query: () => URLS.HEALTHCHECK,
}),
}),
});
使用 RTK 查询,可以使用 transformResponse
转换端点的响应,如下所示:
import { apiSlice } from '../api/apiSlice'
const usersAdapter = createEntityAdapter()
const initialState = usersAdapter.getInitialState()
import { camelizeKeys } from 'humps'
export const extendedApiSlice = apiSlice.injectEndpoints({
endpoints: builder => ({
getUsers: builder.query({
query: () => '/users',
transformResponse: (response) => camelizeKeys(response.data),
}),
// … 25 other endpoints
})
})
如果每个端点响应都需要以某种方式进行转换,例如通过 humps camelizeKeys
函数,这将很快变得非常重复。
推荐的 way/best 做法是什么(全局)为所有查询定义一个 transformResponse
(理想情况下是为所有突变定义另一个)?
我认为定义这种全局转换的最佳位置是自定义 baseQuery
:
export const baseQueryWithCamelize: BaseQueryFn<
string | FetchArgs,
unknown,
FetchBaseQueryError
> = async (args, api, extraOptions = {}) => {
const result = await baseQuery(args, api, extraOptions);
if (result.data) {
result.data = camelizeKeys(result.data as any);
}
return result;
};
那么你应该在 root 中使用它 api
def:
export default createApi({
baseQuery: baseQueryWithCamelize,
tagTypes: TAGS,
endpoints: (builder) => ({
healthcheck: builder.query<void, void>({
query: () => URLS.HEALTHCHECK,
}),
}),
});