Skip to content

Commit

Permalink
type: support initialData
Browse files Browse the repository at this point in the history
  • Loading branch information
NelsonYong committed May 15, 2024
1 parent 3b72edd commit f0b2648
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 44 deletions.
17 changes: 11 additions & 6 deletions packages/hooks/src/useRequest/Fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import {
UseRequestOptions,
UseRequestPluginReturn,
UseRequestService,
UseRequestOptionsWithFormatResult
UseRequestOptionsWithFormatResult,
UseRequestOptionsWithInitialData,
} from './types'

export default class Fetch<TData, TParams extends unknown[] = any> {
Expand All @@ -24,7 +25,11 @@ export default class Fetch<TData, TParams extends unknown[] = any> {

constructor(
public serviceRef: Ref<UseRequestService<TData, TParams>>,
public options: Partial<UseRequestOptions<TData, TParams, any> & UseRequestOptionsWithFormatResult<TData, TParams, any, any>>,
public options: Partial<
UseRequestOptions<TData, TParams, any> &
UseRequestOptionsWithFormatResult<TData, TParams, any, any>
> &
UseRequestOptionsWithInitialData<TData, TParams, any>,
public setUpdateData: (
currentState: unknown,
key?: keyof UseRequestFetchState<TData, TParams>,
Expand Down Expand Up @@ -117,7 +122,7 @@ export default class Fetch<TData, TParams extends unknown[] = any> {
)
// Do you want to stop the request
if (stopNow) {
return new Promise(() => { })
return new Promise(() => {})
}

this.setState({
Expand Down Expand Up @@ -145,7 +150,7 @@ export default class Fetch<TData, TParams extends unknown[] = any> {
this.runPluginHandler('onError', error, params)

// Manually intercept the error and return a Promise with an empty status
return new Promise(() => { })
return new Promise(() => {})
}

try {
Expand All @@ -155,7 +160,7 @@ export default class Fetch<TData, TParams extends unknown[] = any> {
const requestReturnResponse = (res: any) => {
// The request has been cancelled, and the count will be inconsistent with the currentCount
if (currentCount !== this.count) {
return new Promise(() => { })
return new Promise(() => {})
}
// Format data
const formattedResult = this.options.formatResult ? this.options.formatResult(res) : res
Expand Down Expand Up @@ -189,7 +194,7 @@ export default class Fetch<TData, TParams extends unknown[] = any> {
return requestReturnResponse(servicePromiseResult)
} catch (error) {
if (currentCount !== this.count) {
return new Promise(() => { })
return new Promise(() => {})
}

this.setState({
Expand Down
2 changes: 1 addition & 1 deletion packages/hooks/src/useRequest/docs/basic/demo/demo.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
<template>
<div>name:{{ loading ? 'loading' : data }}</div>
{{ data }}
</template>

<script lang="ts" setup>
Expand All @@ -16,5 +15,6 @@
const { data, loading } = useRequest(() => getUsername({ desc: 'good' }), {
debugKey: 'demo',
initialData:"000"
})
</script>
30 changes: 19 additions & 11 deletions packages/hooks/src/useRequest/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ export interface UseRequestPluginReturn<TData, TParams extends unknown[]> {
params: TParams,
) =>
| ({
stopNow?: boolean
returnNow?: boolean
} & Partial<UseRequestFetchState<TData, TParams>>)
stopNow?: boolean
returnNow?: boolean
} & Partial<UseRequestFetchState<TData, TParams>>)
| void

onRequest?: (
Expand All @@ -46,17 +46,15 @@ export type RequestHook<TData = any, TParams extends any[] = any[]> = (
plugins: UseRequestPlugin<TData, TParams>[],
) => useRequestResult<TData, TParams>



export type UseRequestMiddleware<TData, TParams extends any[]> = (
useRequestNext: RequestHook<TData, TParams>
useRequestNext: RequestHook<TData, TParams>,
) => RequestHook<TData, TParams>

export type UseRequestBasicOptions<TData, TParams extends unknown[]> = {
/**
* Init data.
*/
initialData?: TData
// initialData?: TData

/**
* - The default is `false.` That is, the service is automatically executed during initialization.
Expand Down Expand Up @@ -250,20 +248,30 @@ export type UseRequestBasicOptions<TData, TParams extends unknown[]> = {
rollbackOnError?: boolean | ((params: TParams) => boolean)
}

export type UseRequestOptions<TData, TParams extends any[] = any[], TPlugin = any> = UseRequestBasicOptions<TData, TParams> &
{
export type UseRequestOptions<
TData,
TParams extends any[] = any[],
TPlugin = any
> = UseRequestBasicOptions<TData, TParams> & {
pluginOptions?: TPlugin
}

export type UseRequestOptionsWithFormatResult<
TData,
TParams extends any[] = any[],
TPlugin = any,
SR = any,
SR = any
> = UseRequestOptions<TData, TParams, TPlugin> & {
formatResult: (res: SR) => TData;
formatResult: (res: SR) => TData
}

export type UseRequestOptionsWithInitialData<
TData,
TParams extends any[] = any[],
TPlugin = any
> = UseRequestOptions<TData, TParams, TPlugin> & {
initialData: TData extends infer R ? R : TData
}

export interface UseRequestPlugin<TData, TParams extends unknown[] = unknown[], TPlugin = any> {
(
Expand Down
106 changes: 80 additions & 26 deletions packages/hooks/src/useRequest/useRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,48 +10,104 @@ import useThrottlePlugin from './plugins/useThrottlePlugin'

import useRequestImplement from './useRequestImplement'

import { UseRequestOptions, UseRequestOptionsWithFormatResult, UseRequestPlugin, useRequestResult, UseRequestService } from './types'
import {
UseRequestOptions,
UseRequestOptionsWithFormatResult,
UseRequestOptionsWithInitialData,
UseRequestPlugin,
useRequestResult,
UseRequestService,
} from './types'
import { withArgs } from './utils/resolve-args'

export type PluginsMiddleOptionsType<
PluginsOptions,
TData,
TParams extends unknown[] = unknown[]
> = PluginsOptions extends (infer P)[]
? P extends UseRequestPlugin<TData, TParams, infer R>
? R
: never
: never

// formatResult
// 同时存在 formatResult 和 initialData
export function useRequest<
TData,
TParams extends unknown[] = unknown[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[],
SR = any,
>(service: UseRequestService<SR, TParams>, options: UseRequestOptionsWithFormatResult<TData, TParams, PluginsOptions extends (infer P)[]
? P extends UseRequestPlugin<TData, TParams, infer R>
? R
: never
: never, SR>, plugins?: PluginsOptions): useRequestResult<TData, TParams>

SR = any
>(
service: UseRequestService<SR, TParams>,
options: UseRequestOptionsWithFormatResult<
TData,
TParams,
PluginsMiddleOptionsType<PluginsOptions, TData, TParams>,
SR
> &
UseRequestOptionsWithInitialData<SR, TParams, PluginsOptions>,
plugins?: PluginsOptions,
): useRequestResult<TData, TParams>

// 无 formatResults
// 只有 formatResult
export function useRequest<
TData,
TParams extends unknown[] = unknown[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[],
>(service: UseRequestService<TData, TParams>, options?: UseRequestOptions<TData, TParams, PluginsOptions extends (infer P)[]
? P extends UseRequestPlugin<TData, TParams, infer R>
? R
: never
: never>, plugins?: PluginsOptions): useRequestResult<TData, TParams>
SR = any
>(
service: UseRequestService<SR, TParams>,
options: UseRequestOptionsWithFormatResult<
TData,
TParams,
PluginsMiddleOptionsType<PluginsOptions, TData, TParams>,
SR
>,
plugins?: PluginsOptions,
): useRequestResult<TData, TParams>

// 只有 initialData
export function useRequest<
TData,
TParams extends unknown[] = unknown[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[]
>(
service: UseRequestService<TData, TParams>,
options?: UseRequestOptions<TData, TParams, PluginsOptions extends (infer P)[]
? P extends UseRequestPlugin<TData, TParams, infer R>
? R
: never
: never>,
options: UseRequestOptionsWithInitialData<
TData,
TParams,
PluginsMiddleOptionsType<PluginsOptions, TData, TParams>
>,
plugins?: PluginsOptions,
) {
): useRequestResult<TData, TParams>

// 无 formatResults 和 initialData
export function useRequest<
TData,
TParams extends unknown[] = unknown[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[]
>(
service: UseRequestService<TData, TParams>,
options?: UseRequestOptions<
TData,
TParams,
PluginsMiddleOptionsType<PluginsOptions, TData, TParams>
>,
plugins?: PluginsOptions,
): useRequestResult<TData, TParams>

export function useRequest<
TData,
TParams extends unknown[] = unknown[],
PluginsOptions extends UseRequestPlugin<TData, TParams>[] = UseRequestPlugin<TData, TParams>[]
>(
service: UseRequestService<TData, TParams>,
options?: UseRequestOptions<
TData,
TParams,
PluginsMiddleOptionsType<PluginsOptions, TData, TParams>
>,
plugins?: PluginsOptions,
) {
const BuiltInPlugins = [
process.env.NODE_ENV === 'development' ? useDevtoolsPlugin : null,
useDebouncePlugin,
Expand All @@ -61,15 +117,13 @@ export function useRequest<
useThrottlePlugin,
useAutoRunPlugin,
useCachePlugin,
useRetryPlugin
useRetryPlugin,
]?.filter(Boolean)

return withArgs<TData, TParams>(useRequestImplement, options?.use)(service, options, [
...(plugins || []),
...BuiltInPlugins
...BuiltInPlugins,
] as UseRequestPlugin<TData, TParams>[])
}



export default useRequest

0 comments on commit f0b2648

Please sign in to comment.