useDictOptions.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { dictDataAll } from '@/api/setting/dict'
  2. import { reactive, toRaw } from 'vue'
  3. interface Options {
  4. [propName: string]: {
  5. api: PromiseFun
  6. params?: Record<string, any>
  7. transformData?(data: any): any
  8. }
  9. }
  10. // {
  11. // dict: {
  12. // api: dictData,
  13. // params: { name: 'user' },
  14. // transformData(data: any) {
  15. // return data.list
  16. // }
  17. // }
  18. // }
  19. export function useDictOptions<T = any>(options: Options) {
  20. const optionsData: any = reactive({})
  21. const optionsKey = Object.keys(options)
  22. const apiLists = optionsKey.map((key) => {
  23. const value = options[key]
  24. optionsData[key] = []
  25. return () => value.api(toRaw(value.params) || {})
  26. })
  27. const refresh = async () => {
  28. const res = await Promise.allSettled<Promise<any>>(apiLists.map((api) => api()))
  29. res.forEach((item, index) => {
  30. const key = optionsKey[index]
  31. if (item.status == 'fulfilled') {
  32. const { transformData } = options[key]
  33. const data = transformData ? transformData(item.value) : item.value
  34. optionsData[key] = data
  35. }
  36. })
  37. }
  38. refresh()
  39. return {
  40. optionsData: optionsData as T,
  41. refresh
  42. }
  43. }
  44. // useDictOptions<{
  45. // dict: any[]
  46. // }>({
  47. // dict: dictData
  48. // })
  49. export function useDictData<T = any>(dict: string[]) {
  50. const options: Options = {}
  51. for (const type of dict) {
  52. options[type] = {
  53. api: dictDataAll,
  54. params: {
  55. dictType: type
  56. }
  57. }
  58. }
  59. const { optionsData } = useDictOptions<T>(options)
  60. return {
  61. dictData: optionsData
  62. }
  63. }