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

如何在Redux Toolkit createAPI中保存mutation结果供后续使用?

首先纠正你代码里的关键错误:POST属于修改服务器资源的操作,RTK Query中这类操作应该用builder.mutation而非builder.query(query仅用于GET类查询请求),修正后的基础代码如下:

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

export const createResource = createApi({
  reducerPath: 'someReducerPath',
  baseQuery: fetchBaseQuery({ baseUrl: window.API_URL }),
  endpoints: (builder) => ({
    postResource: builder.mutation({
      query: (postBody) => ({
        url: 'someURL',
        method: 'POST',
        body: postBody
      }),
      transformResponse: (response) => response
    }),
  }),
});

export const { usePostResourceMutation } = createResource;

针对复用mutation结果的需求,有三种可行方案:

方案一:用RTK Query自带Selector获取缓存结果

RTK Query会自动缓存mutation的执行结果,你可以通过生成的endpoint selector,传入原payload直接从Redux Store中取出对应结果:

import { useSelector } from 'react-redux';
import { createResource } from './path-to-your-api-file';

function TargetComponent() {
  // 传入和之前调用mutation完全一致的payload
  const mutationResult = useSelector(
    createResource.endpoints.postResource.select(yourPreviousPayload)
  );

  if (mutationResult.isSuccess) {
    return <div>复用创建结果:{JSON.stringify(mutationResult.data)}</div>;
  }
  return <div>暂无可用结果</div>;
}

方案二:用useMutationState获取最近的mutation结果

如果不想依赖原payload,想直接获取最近一次成功执行的postResource mutation结果,可以用RTK Query提供的useMutationState钩子:

import { useMutationState } from '@reduxjs/toolkit/query/react';
import { createResource } from './path-to-your-api-file';

function TargetComponent() {
  // 筛选出最近一次成功完成的postResource mutation
  const [latestSuccessMutation] = useMutationState({
    endpoint: 'postResource',
    select: (states) => states
      .filter(state => state.status === 'fulfilled')
      .sort((a, b) => b.fulfilledTimeStamp - a.fulfilledTimeStamp)
      .slice(0, 1)
  });

  if (latestSuccessMutation) {
    return <div>最近创建结果:{JSON.stringify(latestSuccessMutation.data)}</div>;
  }
  return <div>暂无可用结果</div>;
}

方案三:将结果存入自定义Redux Slice

如果需要全局无限制复用结果,且不想受RTK Query缓存规则约束,可以在mutation的onSuccess回调中将结果存入自定义slice:

  1. 创建存储结果的slice:
import { createSlice } from '@reduxjs/toolkit';

const createdResourceSlice = createSlice({
  name: 'createdResource',
  initialState: { data: null },
  reducers: {
    saveCreatedResource: (state, action) => {
      state.data = action.payload;
    }
  }
});

export const { saveCreatedResource } = createdResourceSlice.actions;
export default createdResourceSlice.reducer;
  1. 修改RTK Query的mutation配置,添加onSuccess回调:
export const createResource = createApi({
  reducerPath: 'someReducerPath',
  baseQuery: fetchBaseQuery({ baseUrl: window.API_URL }),
  endpoints: (builder) => ({
    postResource: builder.mutation({
      query: (postBody) => ({
        url: 'someURL',
        method: 'POST',
        body: postBody
      }),
      transformResponse: (response) => response,
      // 成功后将结果存入自定义slice
      onSuccess: (response, _, { dispatch }) => {
        dispatch(saveCreatedResource(response));
      }
    }),
  }),
});
  1. 在任意组件中通过useSelector获取结果:
import { useSelector } from 'react-redux';

function AnyComponent() {
  const createdResource = useSelector(state => state.createdResource.data);
  
  if (createdResource) {
    return <div>全局复用结果:{JSON.stringify(createdResource)}</div>;
  }
  return <div>暂无可用结果</div>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:45:54