Usage > Customizing createApi: adding customized variations">Usage > Customizing createApi: adding customized variations">
跳至主要內容

自訂 createApi

目前,RTK Query 包含兩種 createApi 變體

  • createBaseApi,僅包含與 UI 無關的 Redux 邏輯(核心模組)
  • createApi,包含核心和 React hooks 模組

您可以透過為模組指定非預設選項或新增自己的模組來建立您自己的 createApi 版本。

自訂 React-Redux Hooks

如果您希望 Hooks 使用不同版本的 useSelectoruseDispatchuseStore,例如您正在使用自訂內容,您可以在建立模組時傳入這些內容

import * as React from 'react'
import {
createDispatchHook,
createSelectorHook,
createStoreHook,
ReactReduxContextValue,
} from 'react-redux'
import {
buildCreateApi,
coreModule,
reactHooksModule,
} from '@reduxjs/toolkit/query/react'

const MyContext = React.createContext<ReactReduxContextValue | null>(null)
const customCreateApi = buildCreateApi(
coreModule(),
reactHooksModule({
hooks: {
useDispatch: createDispatchHook(MyContext),
useSelector: createSelectorHook(MyContext),
useStore: createStoreHook(MyContext),
},
})
)

自訂 RTKQ 的 createSelector

coreModulereactHooksModule 都接受 createSelector 選項,該選項應該是 Reselect 的選擇器建立常式或具有等效簽章。

import * as React from 'react'
import { createSelectorCreator, lruMemoize } from '@reduxjs/toolkit'
import {
buildCreateApi,
coreModule,
reactHooksModule,
} from '@reduxjs/toolkit/query/react'

const createLruSelector = createSelectorCreator(lruMemoize)

const customCreateApi = buildCreateApi(
coreModule({ createSelector: createLruSelector }),
reactHooksModule({ createSelector: createLruSelector })
)

建立您自己的模組

如果您想建立您自己的模組,您應該檢閱 react-hooks 模組 以了解實作會是什麼樣子。

以下是極簡版本

import { CoreModule } from '@internal/core/module'
import {
BaseQueryFn,
EndpointDefinitions,
Api,
Module,
buildCreateApi,
coreModule,
} from '@reduxjs/toolkit/query'

export const customModuleName = Symbol()
export type CustomModule = typeof customModuleName

declare module '../apiTypes' {
export interface ApiModules<
BaseQuery extends BaseQueryFn,
Definitions extends EndpointDefinitions,
ReducerPath extends string,
TagTypes extends string,
> {
[customModuleName]: {
endpoints: {
[K in keyof Definitions]: {
myEndpointProperty: string
}
}
}
}
}

export const myModule = (): Module<CustomModule> => ({
name: customModuleName,
init(api, options, context) {
// initialize stuff here if you need to

return {
injectEndpoint(endpoint, definition) {
const anyApi = api as any as Api<
any,
Record<string, any>,
string,
string,
CustomModule | CoreModule
>
anyApi.endpoints[endpoint].myEndpointProperty = 'test'
},
}
},
})

export const myCreateApi = buildCreateApi(coreModule(), myModule())