钩子定义
/* eslint-disable @typescript-eslint/no-explicit-any */
import useUrlState, { Options } from '@ahooksjs/use-url-state'
import { INIT_COLLECTION } from '../store/slowLogDetailSearch'
import { INIT_RANGE } from '../store/globalSearch'
const useMyUrlState = <T>(params?: T, options?: Options) =>
useUrlState(
{
instance: INIT_RANGE.instanceId,
timeRange: INIT_RANGE.timeRange,
collection: INIT_COLLECTION,
...params,
},
{
parseOptions: { parseNumbers: true, arrayFormat: 'comma' },
stringifyOptions: { skipNull: true, arrayFormat: 'comma' },
navigateMode: 'replace',
...options,
}
)
export useMyUrlState
import { useLatest } from 'ahooks'
import useMyUrlState from './useMyUrlState'
export function useUrlParamMethod<
T extends Record<string, string>,
R,
A extends unknown[],
P,
>(defaultUrlParams: T, method: (params: { urlState: Partial<T> } & P, ...args: A) => R) {
const [urlState] = useMyUrlState({ ...defaultUrlParams })
const urlStateRef = useLatest(urlState)
return (params: Omit<P, 'urlState'> & { urlState?: Partial<T> }, ...args: A) =>
method({ urlState: urlStateRef.current, ...params }, ...args)
}
使用示例
const fetchSlowLogs = useUrlParamMethod(
{ instance: INIT_RANGE.instanceId, collection: INIT_COLLECTION },
fetchMethod
)