RTK Query中enhanceEndpoints()作用与injectEndpoints区别及语法问题
enhanceEndpoints与injectEndpoints的核心区别 你提到的api.injectEndpoints({ overrideExisting: false, endpoints:...})写法完全无法实现和enhanceEndpoints相同的效果,两者从设计目标到执行逻辑都有本质差异:
- 执行逻辑不同:
overrideExisting: false的作用仅仅是「遇到已存在的同名端点时,直接跳过注入,不抛出报错」,根本不会做任何字段级的合并操作。而enhanceEndpoints的逻辑就是官方文档描述的,针对单个端点的配置做浅合并(等价于Object.assign(existingEndpoint, newPartialEndpoint)),只会覆盖你传入的字段,原有配置的其他字段会完整保留。 - 设计目标不同:
injectEndpoints是为代码拆分场景设计的,核心作用是给api实例新增之前不存在的端点,比如按路由懒加载不同业务模块的端点定义。enhanceEndpoints是为扩展已有端点场景设计的,核心作用是修改已经存在的端点配置——最常见的场景就是给基础api中预定义的通用端点,补充缓存tag配置、调整缓存时长、添加通用的请求/响应转换逻辑,不需要重写整个端点的核心定义。 - 传参要求不同:
injectEndpoints要求传入的必须是完整的端点定义,必须通过builder.query()/builder.mutation()声明请求路径、请求方法等核心配置,否则端点无法正常运行。enhanceEndpoints只需要传入你想要修改的部分字段即可,不需要关心原有端点的核心逻辑。
关于
endpoints的语法说明 你观察到的示例写法,确实是enhanceEndpoints专属的语法形式,和injectEndpoints的语法要求不通用:
injectEndpoints的endpoints字段仅支持一种写法:传入以builder为入参的函数,通过builder.query/mutation构造完整的端点定义,没有其他合法写法。enhanceEndpoints的endpoints字段支持两种写法:- 对象写法:对象的key为需要修改的端点名称,value为需要合并到该端点的部分配置对象,比如示例中仅传入
providesTags、invalidatesTags字段,不需要重复写请求逻辑相关配置。 - 函数写法:对象的key为需要修改的端点名称,value为一个接收当前端点完整配置对象作为入参的函数,你可以直接在函数内部修改该配置对象的属性,适合需要基于原有配置动态调整参数的场景,比如示例中修改
getUsers端点的providesTags和keepUnusedDataFor属性。
- 对象写法:对象的key为需要修改的端点名称,value为需要合并到该端点的部分配置对象,比如示例中仅传入
举个最直观的场景对比:如果你在基础api中已经定义了getUserByUserId端点,写好了完整的请求路径、响应转换逻辑。如果用injectEndpoints给它加providesTags配置,你必须把整个端点的核心逻辑重写一遍,还要开启overrideExisting: true,很容易因为手写重复代码引入错误;而用enhanceEndpoints你只需要传入providesTags: ['User']这一行配置即可,原有逻辑完全不受影响。
内容的提问来源于stack exchange,提问作者Chong Lip Phang
相关产品推荐
相关产品推荐

