跳至主要内容

API 切片:代码拆分和生成

每个 API 切片允许在初始 API 切片定义后,在运行时注入其他端点定义。这对于可能具有许多端点的应用程序来说可能是有益的。

单个 API 切片端点定义也可以拆分到多个文件中。这主要用于处理从 API 模式文件 代码生成的 API 切片,允许您向一组自动生成的端点定义添加额外的自定义行为和配置。

每个 API 切片对象都有 injectEndpointsenhanceEndpoints 函数来支持这些用例。

injectEndpoints

签名

const injectEndpoints = (endpointOptions: InjectedEndpointOptions) =>
EnhancedApiSlice

interface InjectedEndpointOptions {
endpoints: (build: EndpointBuilder) => NewEndpointDefinitions
/**
* Optionally allows endpoints to be overridden if defined by multiple `injectEndpoints` calls.
*
* If set to `true`, will override existing endpoints with the new definition.
* If set to `'throw'`, will throw an error if an endpoint is redefined with a different definition.
* If set to `false` (or unset), will not override existing endpoints with the new definition, and log a warning in development.
*/
overrideExisting?: boolean | 'throw'
}

描述

接受一个包含与您传递给 createApi.endpoints 相同的 endpoints 构建器回调的选项对象。使用该构建器定义的任何端点定义都将使用浅层合并合并到此 API 切片的现有端点定义中,因此任何新的端点定义都将覆盖具有相同名称的现有端点。

返回 API 切片对象的更新和增强版本,其中包含组合的端点定义。

除非将 overrideExisting 设置为 true,否则不会覆盖端点。如果没有,将显示一个开发模式警告,以通知您端点定义之间是否存在名称冲突。

此方法主要用于代码拆分和热重载。

enhanceEndpoints

签名

const enhanceEndpoints = (endpointOptions: EnhanceEndpointsOptions) =>
EnhancedApiSlice

interface EnhanceEndpointsOptions {
addTagTypes?: readonly string[]
endpoints?: Record<string, Partial<EndpointDefinition>>
}

描述

任何提供的标签类型或端点定义都将合并到此 API 切片的现有端点定义中。与 injectEndpoints 不同,部分端点定义不会替换现有定义,而是按定义基础合并在一起(即,Object.assign(existingEndpoint, newPartialEndpoint))。

返回 API 切片对象的更新和增强版本,其中包含组合的端点定义。

这主要用于获取从 API 模式文件(如 OpenAPI)代码生成的 API 切片对象,并在生成的端点定义之上添加额外的特定手工编写的缓存失效管理配置。

例如,enhanceEndpoints 可用于通过更改 providesTagsinvalidatesTagskeepUnusedDataFor 的值来修改缓存行为。

import { api } from './api'

const enhancedApi = api.enhanceEndpoints({
addTagTypes: ['User'],
endpoints: {
getUserByUserId: {
providesTags: ['User'],
},
patchUserByUserId: {
invalidatesTags: ['User'],
},
// alternatively, define a function which is called with the endpoint definition as an argument
getUsers(endpoint) {
endpoint.providesTags = ['User']
endpoint.keepUnusedDataFor = 120
},
},
})