# 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); }, }; ```