# Vben ApiComponent API组件包装器
用于包装其它组件,为目标组件提供自动获取远程数据的能力。
## 基础用法
包装 Select 组件,自动获取远程选项:
```vue
```
## 包装级联选择器
```vue
```
## 请求参数
```vue
```
## 请求前后处理
```vue
```
## 自动选择选项
```vue
```
## Props 属性
| 属性名 | 描述 | 类型 | 默认值 |
|--------|------|------|--------|
| modelValue | 当前值 | `any` | - |
| component | 目标组件 | `Component` | - |
| api | 获取数据的函数 | `(arg?) => Promise` | - |
| params | 传递给api的参数 | `object` | - |
| resultField | 从结果中提取数组的字段名 | `string` | - |
| labelField | label字段名 | `string` | `label` |
| valueField | value字段名 | `string` | `value` |
| childrenField | 子级数据字段名 | `string` | - |
| optionsPropName | 目标组件接收options的属性名 | `string` | `options` |
| modelPropName | 目标组件的双向绑定属性名 | `string` | `modelValue` |
| immediate | 是否立即调用api | `boolean` | `true` |
| alwaysLoad | 每次显示时重新请求 | `boolean` | `false` |
| beforeFetch | 请求前的回调 | `(params) => any` | - |
| afterFetch | 请求后的回调 | `(data) => any` | - |
| options | 直接传入选项数据 | `OptionsItem[]` | - |
| visibleEvent | 触发请求的事件名 | `string` | - |
| loadingSlot | 显示loading的插槽名 | `string` | - |
| numberToString | 将value从数字转为string | `boolean` | `false` |
| autoSelect | 自动设置选项 | `'first' \| 'last' \| 'one'` | `false` |
## Methods 方法
| 方法 | 描述 | 类型 |
|------|------|------|
| getComponentRef | 获取被包装组件的实例 | `() => T` |
| updateParam | 设置接口请求参数 | `(params) => void` |
| getOptions | 获取已加载的选项数据 | `() => OptionsItem[]` |
| getValue | 获取当前值 | `() => any` |
## 并发和缓存
使用 Tanstack Query 包装接口请求,实现并发控制和缓存:
```ts
import { useQuery } from '@tanstack/vue-query';
function useUserOptions() {
return useQuery({
queryKey: ['user-options'],
queryFn: () => getUserListApi(),
staleTime: 5 * 60 * 1000, // 5分钟缓存
});
}
```
## 适配器配置
在应用适配器中预包装组件:
```ts
// src/adapter/component.ts
import { ApiComponent } from '@vben/common-ui';
import { Select, TreeSelect } from 'ant-design-vue';
const components = {
ApiSelect: (props, { attrs, slots }) => {
return h(ApiComponent, {
...props,
...attrs,
component: Select,
}, slots);
},
ApiTreeSelect: (props, { attrs, slots }) => {
return h(ApiComponent, {
...props,
...attrs,
component: TreeSelect,
childrenField: 'children',
}, slots);
},
};
```