如何将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
相关产品推荐
相关产品推荐

