Skip to content

useDict

使用前全局注入请求实例,就不用每次都传入请求实例了

ts
// main.ts
import { useDictConfigProvider } from '@yusui/composables'

import { request } from '@/api'

useDictConfigProvider({ request })

基础用法

select:



tree-select:


View Source
vue
<script setup lang="ts">
import { ref } from 'vue'

import { useDict } from '.'

const dicData = [
  { label: 'label1', value: 'value1' },
  { label: 'label2', value: 'value2' },
]
const treeData = [
  {
    label: 'label1',
    value: 'value1',
    children: [
      { label: 'label1-1', value: 'value1-1' },
      { label: 'label1-2', value: 'value1-2' },
    ],
  },
  {
    label: 'label2',
    value: 'value2',
    children: [
      { label: 'label2-1', value: 'value2-1' },
      { label: 'label2-2', value: 'value2-2' },
    ],
  },
]

const dicMap = {
  '/dict/dicData': dicData,
  '/dict/treeData': treeData,
}

// 模拟请求
function request({ url }: { url: keyof typeof dicMap }) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({
        data: {
          data: dicMap[url],
        },
      })
    }, 3000)
  })
}

const selectValue = ref('')
const {
  data: selectData,
  loading: selectLoading,
  selectedLabel,
  selectedItem,
} = useDict({ modelValue: selectValue, dicData })

const treeSelectValue = ref('value1-1')
const {
  data: treeSelectData,
  loading: treeSelectLoading,
  selectedItem: treeSelectedItem,
  selectedLabel: treeSelectedLabel,
} = useDict({ modelValue: treeSelectValue, request: request as any, dicUrl: '/dict/treeData' })
</script>

<template>
  select: <el-select v-model="selectValue" :data="selectData" :loading="selectLoading">
    <el-option v-for="item in selectData" :key="item.value" :label="item.label" :value="item.value" />
  </el-select>
  <br>
  <el-text>{{ selectedLabel }}</el-text>
  <br>
  <el-text>{{ selectedItem }}</el-text>
  <br>
  tree-select: <el-tree-select v-model="treeSelectValue" :data="treeSelectData" :loading="treeSelectLoading" node-key="value" />
  <br>
  <el-text>{{ treeSelectedLabel }}</el-text>
  <br>
  <el-text>{{ treeSelectedItem }}</el-text>
</template>

UseDictOptions

名称类型默认值说明
requestAxiosInstance请求实例,可通过useDictConfigProvider全局注入
propsDicProps字典属性配置
dicDataArray静态字典项
dicUrlString字典请求接口地址
dicQueryObject字典请求参数
dicHeadersObject字典请求头
dicFormatter(res) => Array字典请求返回数据格式化
dicMethodString'get'字典请求方式

DicProps

名称类型默认值说明
labelString'label'字典标题属性名
valueString'value'字典值属性名
childrenString'children'字典子项属性名
disabledString'disabled'字典禁用项属性名
resString'data'字典请求返回的数据结构(如'data.records')

UseDictReturn

名称类型说明
dataRef<Array>字典项
loadingRef<boolean>加载状态
dictValueRef<boolean>可用于绑定的字典值
selectedItemRef<DicItem|DicItem[]|null>已选择的字典项(多个为数组)
selectedLabelRef<string|undefined>已选择的字典项标题(多个为逗号分割)

类型定义

ts
import type { MaybeRefOrGetter, Ref } from 'vue'
import type { AxiosInstance } from 'axios'
import type { DicItem, DicProps } from '@smallwei/avue'
import type { useRequest } from 'vue-request'

export interface UseDictOptions {
  /** 绑定值 */
  modelValue?: MaybeRefOrGetter<UseDictValue>
  /** 请求实例 */
  request?: AxiosInstance
  // /** 数据类型用于数组和字符串之间的转化 */
  // dataType?: string
  // /** 分隔符 */
  // separator?: string
  /** 数据字典属性的配置对象 */
  props?: DicProps
  /** 数据字典值 */
  dicData?: MaybeRefOrGetter<DicItem[]>
  /** 数据字典接口url地址 */
  dicUrl?: string
  /** 数据字典接口url携带请求参数 */
  dicQuery?: object
  /** 数据字典接口url携带头部参数 */
  dicHeaders?: object
  /** 数据字典接口url返回数据格式化方法 */
  dicFormatter?: (res: any) => DicItem[]
  /** 数据字典接口请求方式 */
  dicMethod?: string
}

export type UseDictValue = string | number | boolean | string[] | number[] | undefined

export interface UseDictReturn extends ReturnType<typeof useRequest<DicItem[]>> {
  selectedItem: Ref<DicItem | DicItem[] | null>
  selectedLabel: Ref<string | undefined>
}