vue3 usePost hook

145 阅读1分钟

import { Ref, ref, UnwrapRef } from "vue";

type UseStateReturnType <T> = [ state: Ref<UnwrapRef<T>>, setState: (newSate: UnwrapRef<T>) => void ]

export function useState <T> (rawData: T): UseStateReturnType<T> {

  const state = ref<T>(rawData)

  const setState = (newSate: UnwrapRef<T>) => {
    state.value = newSate
  }

  return [
    state,
    setState
  ]

}

export const enum ResultState {
  'SUCCESS' = 0,
  'SERVE_ERROR' = 500
}

export function hasError (result: ResultBaseData) {
  const { code, msg } = result
  if (code !== ResultState.SUCCESS) {
    message.error(msg)
    return true
  }
}




import { onMounted } from "vue";
import { useState } from "./useState";
import { hasError } from '@/share'

interface UsePostParams <T> {
  getMethod: () => Promise<ResultBaseData>,
  initData: T,
  processResult?: (data: any) => any 
}

export function usePost <T> (usePostParams: UsePostParams<T>) {
  
  const { getMethod, initData, processResult } = usePostParams

  const [ loading, setLoading ] = useState(false)

  const [ resultData, setResultData ] = useState(initData)

  const getResult = async () => {
    try {
      setLoading(true)
      const result = await getMethod()
      setLoading(false)
      const { data } = result
      if (hasError(result)) return 
      if (processResult) {
        setResultData(processResult(data))
      } else {
        setResultData(data)
      }
    } catch (error) {
      setLoading(false)
    }
  }

  onMounted(() => {
    getResult()
  })
  

  return {
    loading,
    getResult,
    resultData,
    setResultData
  }

}