我正在使用 RTK Query 下载数据,然后在本地操作该数据,而不进行任何 api 突变。所以我已经使用extraReducers
api.js
const baseApi = createApi({
reducerPath: "baseApi",
baseQuery: fetchBaseQuery({
baseUrl: Globals.BASE_URL + "/api",
prepareHeaders,
}),
endpoints: () => ({}),
});
export default baseApi;
draftables.js
export const { useGetDraftablesQuery } = baseApi.injectEndpoints({
endpoints: build => ({
getDraftables: build.query({
query: ({ draftgroupId, gameTypeId }) => "whatever/url",
transformResponse: ({ data: players }) =>
players.map(transformApiPlayer),
}),
}),
});
currentDraftSlice.js
const currentDraftSlice = createSlice({
name: "currentDraft",
initialState,
extraReducers: builder => {
builder.addMatcher(
baseApi.endpoints.getDraftables.matchFulfilled,
(state, action) => {
state.players = action.payload.map(p => ({
...p,
drafted: false,
}));
}
);
},
// ... rest of the slice
但是,应用程序崩溃说无法matchFulfilled
从未定义中获取。或类似的东西。这似乎正在发生,因为createSlice
在 aftercreateApi
但before injectEndpoints
运行。
我通过在切片文件中导入注入解决了这个问题:
import "../../../services/api/draftables"; // inject draftables endpoint
但这感觉不对,它绝对不是中心化的。
是否有解决方案,或者至少是最佳实践?
顺便说一句,我明白获取数据并在本地操作它不是 RTK 查询的预期用例,但这是我想要使用它的方式。API 层抽象太好了,不能放弃。