使用 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
})
})
如果每个端点响应都需要以某种方式转换,例如通过驼峰camelizeKeys
函数,这很快就会变得非常重复。
(全局)为所有查询定义一个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;
};
然后你应该在 rootapi
def 中使用它:
export default createApi({
baseQuery: baseQueryWithCamelize,
tagTypes: TAGS,
endpoints: (builder) => ({
healthcheck: builder.query<void, void>({
query: () => URLS.HEALTHCHECK,
}),
}),
});
这适用于不使用打字稿的任何人。
changeResponse
是用于更改所有端点响应的函数,它应该返回您想要的任何内容,即数组或对象。
import {changeResponse} from "../functions/changeResponse"
const baseQueryWithChange = async (args, api, extraOptions) => {
let result = await baseQuery(args, api, extraOptions);
if (result.data) {
result.data = changeResponse(result.data.data) // function used to transform global response
}
return result
}
使用baseQueryWithChange
函数包装baseQuery
。
export const apiSlice = createApi({
baseQuery: baseQueryWithChange,
endpoints: builder => ({})
})
您可以在fetchBaseQuery
中使用responseHandler
const customFetchBaseQuery = ({ ...props }:FetchBaseQueryArgs) => fetchBaseQuery({
...props,
responseHandler: (response) => {
camelizeKeys(response.data)
},
});
并在createApi
中使用
export const userApi = createApi({
//...
baseQuery: customFetchBaseQuery({ baseUrl: '/' }),
///...