如何在RTK Query中为单个端点覆盖缓存键?
为单个RTK Query端点自定义缓存键的最优方案
方法1:直接在目标端点单独配置serializeQueryArgs
这是最简洁的方案,无需全局修改或拆分API——RTK Query允许在单个端点的配置中覆盖缓存键序列化逻辑,其他端点自动沿用默认行为:
export const dumbApi = createApi({ reducerPath: 'our-dumb-api', baseQuery: fetchBaseQuery({ baseUrl: 'some-value' }), endpoints: (build) => ({ sensibleEndpoint: build.query<SensibleEndpointResponse, void>({ query: () => '/sensible-endpoint', // 无需额外配置,自动使用默认缓存键序列化逻辑 }), ridiculousEndpoint: build.query<RidiculousEndpointResponse, RidiculousEndpointRequestData>({ query: (requestData) => ({ url: '/ridiculous-endpoint', method: 'POST', body: requestData, }), // 仅为该端点自定义缓存键序列化逻辑 serializeQueryArgs: ({ endpointName, queryArgs }) => { const { property1, property2 } = queryArgs; return `${endpointName}(property1='${property1}',property2='${property2}')`; }, }), }), });
这种方式完全符合RTK Query的设计原则,既解决了目标端点的缓存键问题,又不影响其他端点的正常逻辑。
方法2:全局配置兼容默认逻辑(备选)
如果出于某些原因必须使用全局serializeQueryArgs,可以自己实现与RTK Query默认行为一致的序列化逻辑,无需依赖未导出的内部函数:
// 实现与RTK Query默认逻辑一致的序列化器 const defaultSerializeQueryArgs = ({ endpointName, queryArgs }) => { return `${endpointName}(${JSON.stringify(queryArgs)})`; }; const customSerializeQueryArgs = (args) => { const { endpointName, queryArgs } = args; if (endpointName === 'ridiculousEndpoint') { const { property1, property2 } = queryArgs; return `${endpointName}(property1='${property1}',property2='${property2}')`; } // 其他端点使用自定义实现的默认逻辑 return defaultSerializeQueryArgs(args); }; export const dumbApi = createApi({ reducerPath: 'our-dumb-api', baseQuery: fetchBaseQuery({ baseUrl: 'some-value' }), serializeQueryArgs: customSerializeQueryArgs, endpoints: (build) => ({ sensibleEndpoint: build.query<SensibleEndpointResponse, void>({ query: () => '/sensible-endpoint', }), ridiculousEndpoint: build.query<RidiculousEndpointResponse, RidiculousEndpointRequestData>({ query: (requestData) => ({ url: '/ridiculous-endpoint', method: 'POST', body: requestData, }), }), }), });
为什么不推荐拆分API?
拆分API会增加代码冗余,额外维护多个API实例也不符合RTK Query聚合相关API的设计初衷,上述两种方法都能在单个API实例内解决问题,是更优选择。
内容的提问来源于stack exchange,提问作者gerrod
相关产品推荐
相关产品推荐

