|
@@ -0,0 +1,143 @@
|
|
|
+import request from '@/config/axios'
|
|
|
+import { isEmpty } from '@/utils/is'
|
|
|
+import { ApiSelectProps } from '@/components/FormCreate/src/type'
|
|
|
+import { jsonParse } from '@/utils'
|
|
|
+
|
|
|
+export const useApiSelect = (option: ApiSelectProps) => {
|
|
|
+ return defineComponent({
|
|
|
+ name: option.name,
|
|
|
+ props: {
|
|
|
+ // 选项标签
|
|
|
+ labelField: {
|
|
|
+ type: String,
|
|
|
+ default: () => option.labelField ?? 'label'
|
|
|
+ },
|
|
|
+ // 选项的值
|
|
|
+ valueField: {
|
|
|
+ type: String,
|
|
|
+ default: () => option.valueField ?? 'value'
|
|
|
+ },
|
|
|
+ // api 接口
|
|
|
+ url: {
|
|
|
+ type: String,
|
|
|
+ default: () => option.url ?? ''
|
|
|
+ },
|
|
|
+ // 请求类型
|
|
|
+ method: {
|
|
|
+ type: String,
|
|
|
+ default: 'GET'
|
|
|
+ },
|
|
|
+ // 请求参数
|
|
|
+ data: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ },
|
|
|
+ // 选择器类型,下拉框 select、多选框 checkbox、单选框 radio
|
|
|
+ selectType: {
|
|
|
+ type: String,
|
|
|
+ default: 'select'
|
|
|
+ },
|
|
|
+ // 是否多选
|
|
|
+ multiple: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ setup(props) {
|
|
|
+ const attrs = useAttrs()
|
|
|
+ const options = ref<any[]>([]) // 下拉数据
|
|
|
+ const getOptions = async () => {
|
|
|
+ options.value = []
|
|
|
+ // 接口选择器
|
|
|
+ if (isEmpty(props.url)) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let data = []
|
|
|
+ switch (props.method) {
|
|
|
+ case 'GET':
|
|
|
+ data = await request.get({ url: props.url })
|
|
|
+ break
|
|
|
+ case 'POST':
|
|
|
+ data = await request.post({ url: props.url, data: jsonParse(props.data) })
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ options.value = data.map((item: any) => ({
|
|
|
+ label: item[props.labelField],
|
|
|
+ value: item[props.valueField]
|
|
|
+ }))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ console.error(`接口[${props.url}] 返回结果不是一个数组`)
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ await getOptions()
|
|
|
+ })
|
|
|
+
|
|
|
+ const buildSelect = () => {
|
|
|
+ if (props.multiple) {
|
|
|
+ // fix:多写此步是为了解决 multiple 属性问题
|
|
|
+ return (
|
|
|
+ <el-select class="w-1/1" {...attrs} multiple>
|
|
|
+ {options.value.map((item, index) => (
|
|
|
+ <el-option key={index} label={item.label} value={item.value} />
|
|
|
+ ))}
|
|
|
+ </el-select>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <el-select class="w-1/1" {...attrs}>
|
|
|
+ {options.value.map((item, index) => (
|
|
|
+ <el-option key={index} label={item.label} value={item.value} />
|
|
|
+ ))}
|
|
|
+ </el-select>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ const buildCheckbox = () => {
|
|
|
+ if (isEmpty(options.value)) {
|
|
|
+ options.value = [
|
|
|
+ { label: '选项1', value: '选项1' },
|
|
|
+ { label: '选项2', value: '选项2' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <el-checkbox-group class="w-1/1" {...attrs}>
|
|
|
+ {options.value.map((item, index) => (
|
|
|
+ <el-checkbox key={index} label={item.label} value={item.value} />
|
|
|
+ ))}
|
|
|
+ </el-checkbox-group>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ const buildRadio = () => {
|
|
|
+ if (isEmpty(options.value)) {
|
|
|
+ options.value = [
|
|
|
+ { label: '选项1', value: '选项1' },
|
|
|
+ { label: '选项2', value: '选项2' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <el-radio-group class="w-1/1" {...attrs}>
|
|
|
+ {options.value.map((item, index) => (
|
|
|
+ <el-radio key={index} value={item.value}>
|
|
|
+ {item.label}
|
|
|
+ </el-radio>
|
|
|
+ ))}
|
|
|
+ </el-radio-group>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ return () => (
|
|
|
+ <>
|
|
|
+ {props.selectType === 'select'
|
|
|
+ ? buildSelect()
|
|
|
+ : props.selectType === 'radio'
|
|
|
+ ? buildRadio()
|
|
|
+ : props.selectType === 'checkbox'
|
|
|
+ ? buildCheckbox()
|
|
|
+ : buildSelect()}
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|