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

如何将Redux Toolkit中createApi的查询结果存储到自定义slice?

实现方案

首先修正配置冲突:你当前postsApi的reducerPath取值为posts,和自定义postsSlice的name相同,同时store配置里注册了两个重名的reducer入口,会导致状态覆盖,先调整postsApi的reducerPath为postsApi避免冲突。


第一步:给自定义slice新增数据更新逻辑

在你的postsSlice中新增reducer,同时通过extraReducers监听getPosts请求成功的生命周期事件,自动同步接口返回数据:

import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { postsApi } from './你的postsApi定义文件路径';

export const postsSlice = createSlice({
  name: "posts",
  initialState,
  reducers: {
    // 也可以保留这个手动设置数据的方法,方便后续主动修改posts数据
    setPosts: (state, action: PayloadAction<PostsType>) => {
      // 按你的业务需求赋值到state对应字段即可,这里假设直接替换整个state
      return action.payload;
    }
  },
  // 新增extraReducers自动监听接口请求成功事件
  extraReducers: (builder) => {
    builder.addMatcher(
      postsApi.endpoints.getPosts.matchFulfilled,
      (state, action) => {
        // action.payload就是getPosts接口返回的完整数据,直接更新到你的slice状态
        return action.payload;
        // 如果你的initialState是对象结构,也可以单独赋值对应字段,比如 state.postList = action.payload.list
      }
    )
  }
});

export const { setPosts } = postsSlice.actions;
export default postsSlice.reducer;

第二步:修正createApi和store的配置

先修改postsApi的reducerPath避免重名:

export const postsApi = createApi({
  reducerPath: "postsApi", // 改这里,避免和postsSlice的name冲突
  baseQuery: getGeneralFetchBaseQuery(),
  endpoints: (builder) => ({
    getPosts: builder.query<PostsType, number>({
      query: (id) => `api/posts/${id}`,
    }),
  }),
});

export const { useGetPostsQuery } = postsApi;

再更新store配置,添加RTK Query必需的中间件:

export const mainStore = configureStore({
  reducer: {
    postsReducer,
    [postsApi.reducerPath]: postsApi.reducer,
  },
  // 必须添加rtk query的中间件,否则缓存、自动重发等功能会失效
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().concat(postsApi.middleware),
})

提示:如果你只是需要全局读取接口返回数据,不需要自定义修改数据的话,可以直接用RTK Query自带的缓存读取能力访问数据,不需要额外同步到自定义slice,减少冗余代码。

配置完成后,只要任意位置触发getPosts请求(包括组件调用useGetPostsQuery、手动dispatchinitiate方法触发请求),接口返回的成功数据都会自动同步到你自定义的postsReducer对应的状态中,全站都可以通过useSelector读取,也可以自定义reducer修改这部分数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 06:54:00