如何禁用特定RTK Query端点的缓存以避免跳转逻辑提前执行
问题根源
你的问题核心不是缓存没禁用,是两个逻辑错误导致没有触发新请求、且提前用旧数据执行了重定向:
- 查询的
skip参数写反了:skip: isSignedIn表示「用户已登录时跳过查询」,登录后根本不会发起新请求,自然只能读到旧缓存 - useEffect未判断请求加载状态
isLoading,请求还在pending的时候就拿着之前的旧data执行了重定向逻辑
修复步骤
1. 先修复基础逻辑错误
首先修正查询的skip参数,改为未登录/没有oid的时候才跳过查询:
const { data, error, isLoading, refetch } = useGetUserByOidQuery(userState?.currentUser?.id, { skip: !isSignedIn || !userState?.currentUser?.id, // 修复写反的逻辑 refetchOnMountOrArgChange: true });
然后修改useEffect,必须等请求加载完成再执行重定向判断:
useEffect(() => { // 未登录、请求还在加载中时不执行逻辑 if (!isSignedIn || isLoading) return; if (data?.status === 'success') { history.push('/user'); } else if (userState.loginType === 'volunteerRegistration') { history.push('/register/volunteer'); } else if (userState.loginType === 'menteeRegistration') { history.push('/register/mentee'); } // 补充全依赖项 }, [isSignedIn, data, isLoading, userState.loginType, history]);
2. 完全禁用端点缓存(可选,推荐用方案A)
如果你确实完全不需要该接口的任何缓存,两种方案选其一即可:
方案A:改为Mutation(最彻底,天生无缓存)
RTK Query的Mutation天生不做缓存,适合这种每次都需要发起新请求的校验场景,修改端点定义:
import { ndovuAPI } from './ndovuAPI'; export const ndovuUserAPI = ndovuAPI.injectEndpoints({ endpoints: builder => ({ getUserByOid: builder.mutation({ // 把query改为mutation query: (oid: string) => `/users/oid/${oid}`, }) }) }); export const { useGetUserByOidMutation } = ndovuUserAPI;
组件内使用方式:
const [getUserByOid, { data, error, isLoading }] = useGetUserByOidMutation(); // 登录后手动触发请求 useEffect(() => { if (isSignedIn && userState?.currentUser?.id) { getUserByOid(userState.currentUser.id); } }, [isSignedIn, userState?.currentUser?.id]);
方案B:保留Query,修改配置完全禁用缓存
修改端点定义:
getUserByOid: builder.query({ query: (oid: string) => `/users/oid/${oid}`, keepUnusedDataFor: 0, // 缓存立即失效 providesTags: () => [], // 不关联任何缓存标签,不会复用缓存 })
组件调用时补充配置:
const { data, error, isLoading } = useGetUserByOidQuery(userState?.currentUser?.id, { skip: !isSignedIn || !userState?.currentUser?.id, refetchOnMountOrArgChange: true, refetchOnFocus: false, refetchOnReconnect: false });
内容的提问来源于stack exchange,提问作者Dijiflex
相关产品推荐
相关产品推荐

