React Toolkit Query中injectEndpoints如何使用transformResponse属性
你对transformResponse的配置位置理解有误,该参数本身就是builder.query配置的顶层属性,不需要放在query函数返回的对象内部,你现有代码的参数位置是正确的,不生效是其他原因导致的,可按以下顺序排查:
- 检查端点重复注册问题
你当前配置的overrideExisting: false表示如果已经存在同名的getDepartments端点,就直接忽略本次注入的配置。如果之前在根API定义或者其他位置已经注册过同名端点,本次添加的transformResponse自然不会生效。你可以临时将overrideExisting改为true测试,如果测试时转换函数能正常触发,说明是重复注册问题,清理掉之前重复的端点定义即可,不需要长期开启overrideExisting。 - 确认触发的是成功响应
transformResponse仅会在接口返回2xx系列成功状态时触发,如果接口返回4xx、5xx等错误状态,需要使用transformErrorResponse参数处理错误响应的转换逻辑。 - 检查根API的全局配置
如果你的根onboardApi定义时设置了全局的transformResponse,要确保全局转换逻辑的返回值没有被截断,会正常传递给端点级别的转换函数。 - 确认请求走RTK Query的触发逻辑
必须使用RTK Query自动生成的useGetDepartmentsQuery、useLazyGetDepartmentsQuery或者端点对应的action creator触发请求,才会执行transformResponse逻辑,自己直接调用fetch/axios发请求不会经过该转换。
测试用修正代码参考:
const departmentsApi = onboardApi.injectEndpoints({ endpoints: builder => ({ getDepartments: builder.query({ query: params => ({ url: `departments`, params, }), transformResponse: response => { console.log('transform', response); return response; }, providesTags: result => { return result ? [ ...result.items.map(({ id }) => ({ type: 'Department', id })), { type: 'Department', id: 'LIST' }, ] : [{ type: 'Department', id: 'LIST' }]; }, }), }), // 临时改为true测试是否是重复注册问题 overrideExisting: true, });
内容的提问来源于stack exchange,提问作者Sisir
相关产品推荐
相关产品推荐

