You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用特定RTK Query端点的缓存以避免跳转逻辑提前执行

问题根源

你的问题核心不是缓存没禁用,是两个逻辑错误导致没有触发新请求、且提前用旧数据执行了重定向:

  1. 查询的skip参数写反了:skip: isSignedIn表示「用户已登录时跳过查询」,登录后根本不会发起新请求,自然只能读到旧缓存
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:15:03