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

如何在RTK Query中访问、更新及删除缓存数据(含认证场景)

RTK Query 认证缓存优化方案

一、直接访问并操作RTK Query缓存

RTK Query的缓存存储在Redux Store中,你可以通过内置工具方法直接读取、更新或清空缓存:

1. 读取缓存中的用户数据

如果是查询接口的缓存,直接用对应的useXXXQuery hook即可;如果是mutation的返回结果,可通过selectLatestResult获取最新值:

import { useSelector } from 'react-redux';
import { api } from './yourApiSlice';

// 获取登录mutation的最新返回结果
const latestUserInfo = useSelector(api.endpoints.login.selectLatestResult());
// 如果有获取用户信息的查询接口,直接用hook读取
const { data: user } = useGetUserQuery();

2. 登出时清空缓存

调用resetApiState可清空整个API的缓存数据,适合登出场景:

import { useDispatch } from 'react-redux';
import { api } from './yourApiSlice';

const handleLogout = () => {
  dispatch(api.util.resetApiState());
  // 配合路由跳转等操作完成登出流程
};

若只需清空特定缓存(比如仅用户相关),可通过invalidateTags标记缓存失效:

dispatch(api.util.invalidateTags(['User']));

3. 更新缓存中的用户数据

当token刷新、用户名修改时,用updateQueryData直接修改缓存内容:

import { useDispatch } from 'react-redux';
import { api } from './yourApiSlice';

const updateUserCache = (newUserData) => {
  dispatch(api.util.updateQueryData('getUser', undefined, (draft) => {
    // 合并新数据到缓存中
    Object.assign(draft, newUserData);
  }));
};

二、统一存储多场景返回的用户数据

通过**标签(Tags)**和onQueryStarted钩子,让登录、注册、重置密码等操作的返回数据统一更新到同一个缓存对象:

1. 配置API Slice的标签与钩子

为所有返回用户数据的mutation添加统一标签,并在请求完成后更新用户查询的缓存:

const api = createApi({
  reducerPath: 'api',
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  tagTypes: ['User'], // 定义用户数据标签
  endpoints: (builder) => ({
    login: builder.mutation({
      query: (credentials) => ({ url: '/login', method: 'POST', body: credentials }),
      onQueryStarted: async (_, { dispatch, queryFulfilled }) => {
        const { data } = await queryFulfilled;
        // 更新getUser查询的缓存
        dispatch(api.util.updateQueryData('getUser', undefined, () => data));
      },
    }),
    register: builder.mutation({
      query: (userData) => ({ url: '/register', method: 'POST', body: userData }),
      onQueryStarted: async (_, { dispatch, queryFulfilled }) => {
        const { data } = await queryFulfilled;
        dispatch(api.util.updateQueryData('getUser', undefined, () => data));
      },
    }),
    resetPassword: builder.mutation({
      query: (resetData) => ({ url: '/reset-password', method: 'POST', body: resetData }),
      onQueryStarted: async (_, { dispatch, queryFulfilled }) => {
        const { data } = await queryFulfilled;
        dispatch(api.util.updateQueryData('getUser', undefined, () => data));
      },
    }),
    getUser: builder.query({
      query: () => '/user',
      providesTags: ['User'], // 关联User标签
    }),
  }),
});

2. 全局统一获取用户数据

之后在任何组件中,只需调用useGetUserQuery就能获取统一维护的用户信息,无需再单独维护slice:

import { useGetUserQuery } from './yourApiSlice';

const UserProfile = () => {
  const { data: user, isLoading } = useGetUserQuery();
  
  if (isLoading) return <div>加载中...</div>;
  
  return (
    <div>
      <p>用户名:{user.username}</p>
      <p>邮箱:{user.email}</p>
    </div>
  );
};

三、辅助配置:自动清理闲置缓存

可通过keepUnusedDataFor设置闲置缓存的自动清理时长,配合手动清空提升缓存管理效率:

const api = createApi({
  reducerPath: 'api',
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  keepUnusedDataFor: 60, // 闲置60秒后自动清理缓存
  // ...其他配置
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:10:08