54 lines
1.2 KiB
Vue
54 lines
1.2 KiB
Vue
<template>
|
|
<el-select class="w-1/1" v-bind="attrs">
|
|
<el-option
|
|
v-for="(item, index) in options"
|
|
:key="index"
|
|
:label="item.label"
|
|
:value="item.value"
|
|
/>
|
|
</el-select>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import request from '@/config/axios'
|
|
import { isEmpty } from '@/utils/is'
|
|
|
|
defineOptions({ name: 'CurrencySelect' })
|
|
|
|
// 接受父组件参数
|
|
interface Props {
|
|
labelField?: string // 字典类型
|
|
valueField?: string // 字典值类型
|
|
restful?: string // api 接口
|
|
}
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
labelField: 'nickname',
|
|
valueField: 'id',
|
|
restful: '/system/user/simple-list'
|
|
})
|
|
|
|
const attrs = useAttrs()
|
|
const options = ref<any[]>([]) // 下拉数据
|
|
const getOptions = async () => {
|
|
options.value = []
|
|
if (isEmpty(props.restful)) {
|
|
return
|
|
}
|
|
// TODO 只支持 GET 查询,复杂下拉构建条件请使用业务表单
|
|
const data = await request.get({ url: props.restful })
|
|
if (Array.isArray(data)) {
|
|
options.value = data.map((item: any) => ({
|
|
label: item[props.labelField],
|
|
value: item[props.valueField]
|
|
}))
|
|
return
|
|
}
|
|
console.log(`接口[${props.restful}] 返回结果不是一个数组`)
|
|
}
|
|
|
|
onMounted(() => {
|
|
getOptions()
|
|
})
|
|
</script>
|