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

RTK Query Mutation返回uninitialized,POST后GET无法自动重取数据

问题分析与解决方案

1. Mutation执行后状态显示uninitialized的原因及解决

你在调用setUser后立刻console.log(result),此时异步请求尚未发起,状态自然是uninitialized。RTK Query的mutation状态是异步更新的,需要通过监听状态变化来获取真实结果:

修改组件代码,监听mutation状态

import React, { useState, useEffect } from "react";
import { useSetUserMutation } from "../../../store/store";
import { useSelector } from "react-redux";

function Row({ row, columnaEstado, columnaVer, handleSelect, selected }) {
  const { session_id: token } = useSelector(({ session }) => session);
  const [setUser, result] = useSetUserMutation();

  // 监听mutation状态变化
  useEffect(() => {
    if (result.isSuccess) {
      console.log("请求成功", result.data);
    } else if (result.isError) {
      console.log("请求失败", result.error);
    } else if (result.isLoading) {
      console.log("请求中...");
    }
  }, [result]);

  const handleDoubleClick = (e) => {
    if (e.detail === 2) {
      setUser({ token, row });
      // 不要在此处立即打印result,此时状态还未更新
    }
  };

  const { formatter: estadoFormatter } = columnaEstado;
  const { formatter: accionFormatter } = columnaVer;
  const selectedStyle = (selected) => {
    return selected ? { backgroundColor: "#eeeeee" } : {};
  };

  return (
    <tr
      key={row.COD_USUARIO}
      onClick={() => handleSelect(row)}
      style={selectedStyle(selected)}
    >
      <td>{row.RNUM}</td>
      <td>{row.ID_USUARIO}</td>
      <td onClick={handleDoubleClick}>{estadoFormatter(row.ESTADO)}</td>
      <td>{accionFormatter([], row)}</td>
    </tr>
  );
}

export default Row;

2. GET请求未自动重取的问题修复

你的invalidatesTags参数存在错误,且providesTags配置不完整,导致RTK Query无法触发列表重取:

修改API切片代码

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

export const usersApi = createApi({
  reducerPath: "users",
  baseQuery: fetchBaseQuery({
    baseUrl: `${config.apiUrl}/api/security`,
  }),
  endpoints: (builder) => ({
    fetchAllUsers: builder.query({
      providesTags: (result) => {
        if (!result?.data) return [{ type: "user", id: "LIST" }];
        // 同时返回单个用户标签和列表总标签,兼顾精准重取和全量重取
        return [
          ...result.data.map(user => ({ type: "user", id: user.COD_USUARIO })),
          { type: "user", id: "LIST" }
        ];
      },
      query: (token) => ({
        url: `UsuariosAll/${token}`,
        method: "GET",
        headers: { "content-type": "application/x-www-form-urlencoded" },
      }),
    }),
    setUser: builder.mutation({
      // 修正:arg是传入的{token, row}对象,需从arg.row中取用户ID
      invalidatesTags: (result, error, arg) => [
        { type: "user", id: arg.row.COD_USUARIO },
        // 若需要修改后直接重取整个列表,添加LIST标签
        { type: "user", id: "LIST" }
      ],
      query: ({ token, row }) => ({
        url: `MenuByUsuario/${token}`,
        method: "POST",
        headers: { "content-type": "application/x-www-form-urlencoded" },
        params: {
          cod_usuario: row.COD_USUARIO,
          status_usuario: row.ESTADO === "ACTIVO" ? 0 : 1,
        },
      }),
    }),
  }),
});

export const { useFetchAllUsersQuery, useSetUserMutation } = usersApi;

关键说明

  • invalidatesTags参数修正:你之前的代码中,invalidatesTags的第三个参数命名为user,但实际传入的是{token, row}对象,必须通过arg.row.COD_USUARIO获取用户ID,才能确保标签匹配。
  • 添加列表总标签:providesTags中新增{type: 'user', id: 'LIST'},既可以通过单个用户标签实现精准重取,也可以通过总标签触发全量列表重取,适配不同需求。
  • 后端POST接口不影响:后端用POST做修改而非PATCH,完全不影响RTK Query的标签失效逻辑,只要标签配置正确就能自动触发重取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:07:13