RTK Query在含父级键的Redux Store中使用异常问题咨询
解决RTK Query reducer嵌套在Redux Store子节点时的pending问题
核心原因
RTK Query 默认期望自身 reducer 位于 Redux Store 的根节点(对应配置的reducerPath),如果被框架嵌套到子节点(比如你的stuff下),RTK Query 无法正确定位自身状态,导致查询一直处于pending状态。
解决方案
方法1:自定义RTK Query钩子,指定状态路径
在调用RTK Query的useQuery/useMutation等钩子时,通过getState选项明确指定RTK Query reducer所在的Store路径:
import { myApi } from './your-api-slice'; // 自定义钩子,覆盖getState指向正确的嵌套路径 export const useGetMyDataQuery = (args, options) => { return myApi.useGetMyDataQuery(args, { ...options, // 替换成你的RTK Query reducer实际位置:state.stuff.[你的reducer键名] getState: (state) => state.stuff.myApi, }); };
之后在组件中使用这个自定义钩子替代原有的RTK Query钩子即可。
方法2:全局修改API实例的状态获取逻辑
如果不想逐个钩子自定义,可以直接修改RTK Query API实例的内部状态获取方法,一次性指定路径:
import { myApi } from './your-api-slice'; // 全局设置RTK Query从嵌套路径获取状态 myApi.internalGetState = (state) => state.stuff.myApi;
方法3:配置setupListeners时指定状态路径
如果使用了RTK Query的setupListeners监听缓存更新,需要同时在其中指定正确的getState:
import { setupListeners } from '@reduxjs/toolkit/query/react'; import store from './framework-provided-store'; import { myApi } from './your-api-slice'; setupListeners(store.dispatch, { getState: () => store.getState().stuff.myApi, });
验证步骤
- 确认你的RTK Query reducer被框架正确合并到
state.stuff.myApi(替换为你的实际键名) - 使用上述任一方法指定路径后,检查组件中查询状态是否正常切换(从pending到fulfilled/error)
内容的提问来源于stack exchange,提问作者Seth Davis
相关产品推荐
相关产品推荐

