Skip to content

React

useCompareEffect

目前使用 ahooks useDeepCompareEffect

usePrevious

目前使用 ahooks usePrevious

useStableFn

主要用于存储 props 中参数是函数的类型。

使用

ts
import { useState, useCallback } from 'react'
import type { CustomError } from './fetcher'
import { useCompareEffect, useStableFn } from '@shilong/utils'

export const useRequest = <TData, TParams extends unknown[]>(
  promiseFn: Service<TData, TParams>,
  options: {
    manual?: boolean
    params?: TParams
    onError?: (err: CustomError) => Error | CustomError
    onSuccess?: (res: CustomError) => void
  } = {}
) => {
  const {
    manual = true,
    params,
    onError = defaultHandleonError,
    onSuccess,
  } = options

  const staPromiseFn = useStableFn(promiseFn)
  const staOnErrorFn = useStableFn(onError)
  const staOnSuccessFn = useStableFn(onSuccess)

  const run = useCallback(
    (...args: TParams) => {
      setLoading(true)
      setError(null)

      const tmp = staPromiseFn.current(...args)

      const finalPromise = tmp.promise
        .then((res) => {
          setData(res)
          setLoading(false)
          staOnSuccessFn.current?.(res)
          return res
        })
        .catch((err) => {
          if (err.name === 'AbortError') return

          setLoading(false)
          setError(err)
          staOnErrorFn.current?.(err)
          throw err
        })

      return {
        promise: finalPromise,
        controller: tmp.controller,
      }
    },
    [staPromiseFn, staOnErrorFn, staOnSuccessFn]
  )

  // ....
}

WIP...