useDict
使用前全局注入请求实例,就不用每次都传入请求实例了
ts
// main.ts
import { useDictConfigProvider } from '@yusui/composables'
import { request } from '@/api'
useDictConfigProvider({ request })
基础用法
select:
tree-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
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
request | AxiosInstance | 请求实例,可通过useDictConfigProvider全局注入 | |
props | DicProps | 字典属性配置 | |
dicData | Array | 静态字典项 | |
dicUrl | String | 字典请求接口地址 | |
dicQuery | Object | 字典请求参数 | |
dicHeaders | Object | 字典请求头 | |
dicFormatter | (res) => Array | 字典请求返回数据格式化 | |
dicMethod | String | 'get' | 字典请求方式 |
DicProps
名称 | 类型 | 默认值 | 说明 |
---|---|---|---|
label | String | 'label' | 字典标题属性名 |
value | String | 'value' | 字典值属性名 |
children | String | 'children' | 字典子项属性名 |
disabled | String | 'disabled' | 字典禁用项属性名 |
res | String | 'data' | 字典请求返回的数据结构(如'data.records') |
UseDictReturn
名称 | 类型 | 说明 |
---|---|---|
data | Ref<Array> | 字典项 |
loading | Ref<boolean> | 加载状态 |
dictValue | Ref<boolean> | 可用于绑定的字典值 |
selectedItem | Ref<DicItem|DicItem[]|null> | 已选择的字典项(多个为数组) |
selectedLabel | Ref<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>
}