API 切片:代码拆分和生成
每个 API 切片允许在初始 API 切片定义后的运行时注入额外的端点定义。这对于可能有_许多_端点的应用程序可能是有益的。
单个 API 切片端点定义也可以跨多个文件进行拆分。这主要用于处理从 API 架构文件代码生成的 API 切片,允许您向一组自动生成的端点定义添加额外的自定义行为和配置。
每个 API 切片对象都有 injectEndpoints
和 enhanceEndpoints
函数来支持这些用例。
injectEndpoints
签名
const injectEndpoints = (endpointOptions: InjectedEndpointOptions) =>
EnhancedApiSlice
interface InjectedEndpointOptions {
endpoints: (build: EndpointBuilder) => NewEndpointDefinitions
/**
* 可选地允许端点被多次 `injectEndpoints` 调用定义时覆盖。
*
* 如果设置为 `true`,将用新定义覆盖现有端点。
* 如果设置为 `'throw'`,如果端点被不同的定义重新定义,将抛出错误。
* 如果设置为 `false`(或未设置),将不会用新定义覆盖现有端点,并在开发中记录警告。
*/
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
可以用来通过更改 providesTags
、invalidatesTags
和 keepUnusedDataFor
的值来修改缓存行为:
// 文件:api.ts noEmit
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
export const api = createApi({
baseQuery: fetchBaseQuery({ baseUrl: '/' }),
endpoints: (builder) => ({
getUserByUserId: builder.query({
query() {
return ''
},
}),
patchUserByUserId: builder.mutation({
query() {
return ''
},
}),
getUsers: builder.query({
query() {
return ''
},
}),
}),
})
// 文件:enhanceEndpoints.ts
import { api } from './api'
const enhancedApi = api.enhanceEndpoints({
addTagTypes: ['User'],
endpoints: {
getUserByUserId: {
providesTags: ['User'],
},
patchUserByUserId: {
invalidatesTags: ['User'],
},
// 或者,定义一个函数,该函数以端点定义为参数调用
getUsers(endpoint) {
endpoint.providesTags = ['User']
endpoint.keepUnusedDataFor = 120
},
},
})