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

如何刷新RTK Query中的过期数据?附代码问题求助

解决RTK Query数据刷新后返回旧数据的问题

核心问题分析

你遇到的问题是RTK Query已发起refetch请求并获取到新数据,但组件依然拿到旧缓存数据,导致角色校验错误触发退出。主要原因可能是:

  • 未正确配置缓存标签(tagTypes/providesTags),导致缓存未被正确更新
  • 组件未处理refetch过程中的状态,直接使用旧缓存数据执行逻辑
  • 查询参数(arg)设置冗余,可能干扰缓存更新逻辑

分步解决方案

1. 配置RTK Query的缓存标签

首先在baseApi中添加tagTypes,并为getUserDetails配置providesTags,确保RTK Query能正确识别缓存条目并更新:

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { baseApiUrl } from 'configs/env-exports';

export const baseApi = createApi({
    reducerPath: 'api',
    baseQuery: fetchBaseQuery({
        baseUrl: baseApiUrl,
        prepareHeaders: (headers) => {
            const token = localStorage.getItem('userToken');
            if (token) {
                headers.set('authorization', token);
            }
            return headers; // 修正:无论是否有token都返回headers
        },
    }),
    tagTypes: ['User'], // 添加标签类型
    endpoints: (builder) => ({
        getUserDetails: builder.query({
            query: () => ({
                url: 'api/v1/account/info',
                method: 'GET',
            }),
            providesTags: ['User'], // 标记该查询提供User标签
        }),
    }),
});

export const { useGetUserDetailsQuery } = baseApi;

2. 优化组件中的查询与逻辑处理

  • 移除冗余的查询参数'userDetails'(因为你的查询不需要参数)
  • 加入isFetching状态判断,避免在refetch过程中使用旧数据触发退出逻辑
  • 调整useEffect的逻辑,确保只在请求完成后处理最新数据
const ProtectedRoute = ({ redirectPath = '/', role }: IProtectedRouteProps) => {
    const exit = () => {
        dispatch(logout());
        navigate(redirectPath, { replace: true });
    };

    // 移除冗余arg,加入isFetching状态
    const { data, isError, isLoading, isFetching } = useGetUserDetailsQuery(undefined, {
        refetchOnMountOrArgChange: true,
        pollingInterval: 30000
    });

    useEffect(() => {
        // 如果正在请求新数据,暂时不处理旧数据
        if (isFetching) return;

        if (isError) {
            exit();
        } else if (data && Object.keys(data).length > 0) {
            dispatch(setCredentials(data));
            const userRole = data?.organization?.role;
            // 只有当角色明确不匹配时才退出
            if (role && userRole && userRole !== role) {
                exit();
            }
        }
    }, [data, isError, role, isFetching]); // 添加isFetching依赖

    // 加载中或请求中时可以显示加载状态
    if (isLoading || isFetching) {
        return <div>Loading...</div>;
    }

    return <div>Protected Content</div>;
};

export default ProtectedRoute;

3. 额外检查点

  • 确认后端返回的新数据结构与IUserInfo类型完全匹配,避免因数据结构不兼容导致缓存更新失败
  • 检查浏览器DevTools的Redux面板,查看api reducer中的缓存数据是否在refetch后更新,以此定位是缓存未更新还是组件未读取新数据

内容的提问来源于stack exchange,提问作者user17485084

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:49:57