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

RTK Query登录切换后仍使用旧token的问题求助

解决RTK Query登录/登出后token不更新导致数据显示异常的问题

问题分析

你当前的核心问题是:createApi初始化时,useAuthToken()只会执行一次并读取当时的token,后续登录/登出导致localStorage里的token更新后,baseQuery的请求头不会自动同步最新token,导致请求一直使用旧token返回旧数据,只有刷新页面重新初始化API配置才会读取新token。

解决方案

1. 动态设置请求头,每次请求读取最新token

不要在baseQuery初始化时直接传入固定的headers,改用prepareHeaders方法,让每次请求都动态获取当前localStorage里的token:

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

export const usersApi = createApi({
  reducerPath: "users",
  baseQuery: fetchBaseQuery({
    baseUrl: "http://127.0.0.1:8080",
    // 每次请求前动态生成请求头
    prepareHeaders: (headers) => {
      const token = localStorage.getItem("token");
      if (token) {
        headers.set("Authorization", `Bearer ${token}`);
      }
      return headers;
    },
  }),
  endpoints: (builder) => ({
    getUserLogged: builder.query({
      query: () => "/check/token",
      // 添加标签,用于后续失效缓存
      providesTags: ["User"],
    }),
  }),
});

export const { useGetUserLoggedQuery } = usersApi;

2. 登出时主动清除旧缓存并触发重新查询

在登出操作中,除了删除localStorage的token,还要通过RTK Query的工具方法让用户数据的缓存失效,强制触发新的请求:

// 假设你的dispatch是从redux hooks中获取的
import { useDispatch } from "react-redux";
import { usersApi } from "./path-to-your-usersApi-file";

const handleLogout = () => {
  // 1. 删除本地存储的token
  localStorage.removeItem("token");
  // 2. 让User标签对应的缓存失效,触发组件重新请求最新数据
  const dispatch = useDispatch();
  dispatch(usersApi.util.invalidateTags(["User"]));
};

3. 简化页面数据获取逻辑(可选)

你页面中用useState转存data的操作是多余的,直接使用RTK Query返回的data即可:

const { data: dataResults, error, isLoading } = useGetUserLoggedQuery();

// 直接使用dataResults渲染即可,无需额外的useEffect和useState

效果说明

修改后,每次请求都会自动读取最新的token,登出时主动清空旧缓存并触发新请求,无需刷新页面就能实时显示当前登录用户的正确数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:12:38