|
|
|
@ -1,9 +1,10 @@ |
|
|
|
<script lang="ts" setup> |
|
|
|
import { ref } from 'vue'; |
|
|
|
import { h, ref } from 'vue'; |
|
|
|
|
|
|
|
import { Page } from '@vben/common-ui'; |
|
|
|
|
|
|
|
import { Button, Card, message, TabPane, Tabs } from 'ant-design-vue'; |
|
|
|
import { useDebounceFn } from '@vueuse/core'; |
|
|
|
import { Button, Card, message, Spin, TabPane, Tabs } from 'ant-design-vue'; |
|
|
|
import dayjs from 'dayjs'; |
|
|
|
|
|
|
|
import { useVbenForm } from '#/adapter/form'; |
|
|
|
@ -12,6 +13,22 @@ import { getAllMenusApi } from '#/api'; |
|
|
|
import DocButton from '../doc-button.vue'; |
|
|
|
|
|
|
|
const activeTab = ref('basic'); |
|
|
|
const keyword = ref(''); |
|
|
|
const fetching = ref(false); |
|
|
|
// 模拟远程获取数据 |
|
|
|
function fetchRemoteOptions({ keyword = '选项' }: Record<string, any>) { |
|
|
|
fetching.value = true; |
|
|
|
return new Promise((resolve) => { |
|
|
|
setTimeout(() => { |
|
|
|
const options = Array.from({ length: 10 }).map((_, index) => ({ |
|
|
|
label: `${keyword}-${index}`, |
|
|
|
value: `${keyword}-${index}`, |
|
|
|
})); |
|
|
|
resolve(options); |
|
|
|
fetching.value = false; |
|
|
|
}, 1000); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
const [BaseForm, baseFormApi] = useVbenForm({ |
|
|
|
// 所有表单项共用,可单独在表单内覆盖 |
|
|
|
@ -64,6 +81,37 @@ const [BaseForm, baseFormApi] = useVbenForm({ |
|
|
|
// 界面显示的label |
|
|
|
label: 'ApiSelect', |
|
|
|
}, |
|
|
|
{ |
|
|
|
component: 'ApiSelect', |
|
|
|
// 对应组件的参数 |
|
|
|
componentProps: () => { |
|
|
|
return { |
|
|
|
api: fetchRemoteOptions, |
|
|
|
// 禁止本地过滤 |
|
|
|
filterOption: false, |
|
|
|
// 如果正在获取数据,使用插槽显示一个loading |
|
|
|
notFoundContent: fetching.value ? undefined : null, |
|
|
|
// 搜索词变化时记录下来, 使用useDebounceFn防抖。 |
|
|
|
onSearch: useDebounceFn((value: string) => { |
|
|
|
keyword.value = value; |
|
|
|
}, 300), |
|
|
|
// 远程搜索参数。当搜索词变化时,params也会更新 |
|
|
|
params: { |
|
|
|
keyword: keyword.value || undefined, |
|
|
|
}, |
|
|
|
showSearch: true, |
|
|
|
}; |
|
|
|
}, |
|
|
|
// 字段名 |
|
|
|
fieldName: 'remoteSearch', |
|
|
|
// 界面显示的label |
|
|
|
label: '远程搜索', |
|
|
|
renderComponentContent: () => { |
|
|
|
return { |
|
|
|
notFoundContent: fetching.value ? h(Spin) : undefined, |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
component: 'ApiTreeSelect', |
|
|
|
// 对应组件的参数 |
|
|
|
|