如何在Redux Toolkit Query中基于Redux状态实现动态组织端点?
从Redux状态动态注入currentOrg简化API端点调用
完全可以不用每次调度action时传入org参数,通过自定义base query从Redux状态中获取currentOrg,自动为需要的API路径添加组织前缀,简化流程。具体实现步骤如下:
1. 自定义Base Query
包装fetchBaseQuery,在其中获取Redux状态里的currentOrg,并根据请求路径判断是否需要添加组织前缀:
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; const baseQuery = fetchBaseQuery({ baseUrl: API_BASE, credentials: 'include' }); // 自定义baseQuery,自动注入currentOrg const customBaseQuery = async (args, api, extraOptions) => { // 从Redux状态中获取currentOrg(替换成你的实际state路径) const currentOrg = api.getState().auth.currentOrg; // 定义需要组织前缀的路径列表 const orgRequiredPaths = ['/users', '/tags']; let modifiedArgs = args; // 检查当前请求是否需要添加组织前缀,且currentOrg存在 const needsOrg = typeof args === 'string' ? orgRequiredPaths.some(path => args.startsWith(path)) : orgRequiredPaths.some(path => args.url.startsWith(path)); if (needsOrg && currentOrg) { // 拼接组织前缀到请求路径 modifiedArgs = typeof args === 'string' ? `/${currentOrg}${args}` : { ...args, url: `/${currentOrg}${args.url}` }; } else if (needsOrg && !currentOrg) { // 处理未选中组织的异常情况 return { error: { status: 'CUSTOM_ERROR', data: '请先选择要查看的组织' } }; } return baseQuery(modifiedArgs, api, extraOptions); };
2. 更新API Slice配置
将createApi中的baseQuery替换为自定义的customBaseQuery,同时简化端点的query配置,无需再传入org参数:
export const apiSlice = createApi({ reducerPath: 'api', baseQuery: customBaseQuery, // 使用自定义baseQuery tagTypes: ['OrgUsers', 'OrgTags'], endpoints: builder => ({ getOrgUsers: builder.query({ query: () => '/users', // 无需传入org,自动添加前缀 providesTags: ['OrgUsers'] }), getOrgTags: builder.query({ query: () => '/tags', providesTags: ['OrgTags'] }), // 无需组织前缀的端点保持原有写法 getGlobalData: builder.query({ query: () => '/global/data', // ... }) }) })
3. 调用端点时无需传org
现在调用这些需要组织前缀的端点时,直接调用即可,不用再传入org参数:
// 之前的写法:dispatch(getOrgUsers({ org: currentOrg })) // 现在的写法: dispatch(getOrgUsers())
这样就实现了从Redux状态自动获取currentOrg,动态修改API路径,避免了重复传参的繁琐流程。
内容的提问来源于stack exchange,提问作者shennan
相关产品推荐
相关产品推荐

