diff --git a/docs/.vitepress/theme/styles/variables.css b/docs/.vitepress/theme/styles/variables.css index d633803c..124bb0c4 100644 --- a/docs/.vitepress/theme/styles/variables.css +++ b/docs/.vitepress/theme/styles/variables.css @@ -104,6 +104,11 @@ --vp-custom-block-tip-text: var(--vp-c-text-1); --vp-custom-block-tip-bg: var(--vp-c-brand-soft); --vp-custom-block-tip-code-bg: var(--vp-c-brand-soft); + + /** + * modal zIndex + */ + --popup-z-index: 1000; } @media (min-width: 640px) { diff --git a/docs/src/components/common-ui/vben-api-component.md b/docs/src/components/common-ui/vben-api-component.md index dac916bf..17b8d306 100644 --- a/docs/src/components/common-ui/vben-api-component.md +++ b/docs/src/components/common-ui/vben-api-component.md @@ -131,26 +131,36 @@ function fetchApi(): Promise> { ### Props -| 属性名 | 描述 | 类型 | 默认值 | -| --- | --- | --- | --- | -| modelValue(v-model) | 当前值 | `any` | - | -| component | 欲包装的组件(以下称为目标组件) | `Component` | - | -| numberToString | 是否将value从数字转为string | `boolean` | `false` | -| api | 获取数据的函数 | `(arg?: any) => Promise>` | - | -| params | 传递给api的参数 | `Record` | - | -| resultField | 从api返回的结果中提取options数组的字段名 | `string` | - | -| labelField | label字段名 | `string` | `label` | -| childrenField | 子级数据字段名,需要层级数据的组件可用 | `string` | `` | -| valueField | value字段名 | `string` | `value` | -| optionsPropName | 目标组件接收options数据的属性名称 | `string` | `options` | -| modelPropName | 目标组件的双向绑定属性名,默认为modelValue。部分组件可能为value | `string` | `modelValue` | -| immediate | 是否立即调用api | `boolean` | `true` | -| alwaysLoad | 每次`visibleEvent`事件发生时都重新请求数据 | `boolean` | `false` | -| beforeFetch | 在api请求之前的回调函数 | `AnyPromiseFunction` | - | -| afterFetch | 在api请求之后的回调函数 | `AnyPromiseFunction` | - | -| options | 直接传入选项数据,也作为api返回空数据时的后备数据 | `OptionsItem[]` | - | -| visibleEvent | 触发重新请求数据的事件名 | `string` | - | -| loadingSlot | 目标组件的插槽名称,用来显示一个"加载中"的图标 | `string` | - | +| 属性名 | 描述 | 类型 | 默认值 | 版本要求 | +| --- | --- | --- | --- | --- | +| modelValue(v-model) | 当前值 | `any` | - | - | +| component | 欲包装的组件(以下称为目标组件) | `Component` | - | - | +| numberToString | 是否将value从数字转为string | `boolean` | `false` | - | +| api | 获取数据的函数 | `(arg?: any) => Promise>` | - | - | +| params | 传递给api的参数 | `Record` | - | - | +| resultField | 从api返回的结果中提取options数组的字段名 | `string` | - | - | +| labelField | label字段名 | `string` | `label` | - | +| childrenField | 子级数据字段名,需要层级数据的组件可用 | `string` | `` | - | +| valueField | value字段名 | `string` | `value` | - | +| optionsPropName | 目标组件接收options数据的属性名称 | `string` | `options` | - | +| modelPropName | 目标组件的双向绑定属性名,默认为modelValue。部分组件可能为value | `string` | `modelValue` | - | +| immediate | 是否立即调用api | `boolean` | `true` | - | +| alwaysLoad | 每次`visibleEvent`事件发生时都重新请求数据 | `boolean` | `false` | - | +| beforeFetch | 在api请求之前的回调函数 | `AnyPromiseFunction` | - | - | +| afterFetch | 在api请求之后的回调函数 | `AnyPromiseFunction` | - | - | +| options | 直接传入选项数据,也作为api返回空数据时的后备数据 | `OptionsItem[]` | - | - | +| visibleEvent | 触发重新请求数据的事件名 | `string` | - | - | +| loadingSlot | 目标组件的插槽名称,用来显示一个"加载中"的图标 | `string` | - | - | +| autoSelect | 自动设置选项 | `'first' \| 'last' \| 'none'\| false` | `false` | >5.5.4 | + +#### autoSelect 自动设置选项 + +如果当前值为undefined,在选项数据成功加载之后,自动从备选项中选择一个作为当前值。默认值为`false`,即不自动选择选项。注意:该属性不应用于多选组件。可选值有: + +- `first`:自动选择第一个选项 +- `last`:自动选择最后一个选项 +- `one`:有且仅有一个选项时,自动选择它 +- false:不自动选择选项 ### Methods diff --git a/docs/src/demos/vben-alert/prompt/index.vue b/docs/src/demos/vben-alert/prompt/index.vue index c9cf5c3e..02a4ccc5 100644 --- a/docs/src/demos/vben-alert/prompt/index.vue +++ b/docs/src/demos/vben-alert/prompt/index.vue @@ -3,7 +3,7 @@ import { h } from 'vue'; import { alert, prompt, VbenButton } from '@vben/common-ui'; -import { Input, RadioGroup } from 'ant-design-vue'; +import { Input, RadioGroup, Select } from 'ant-design-vue'; import { BadgeJapaneseYen } from 'lucide-vue-next'; function showPrompt() { @@ -18,7 +18,7 @@ function showPrompt() { }); } -function showSelectPrompt() { +function showSlotsPrompt() { prompt({ component: Input, componentProps: { @@ -37,6 +37,29 @@ function showSelectPrompt() { }); } +function showSelectPrompt() { + prompt({ + component: Select, + componentProps: { + options: [ + { label: 'Option A', value: 'Option A' }, + { label: 'Option B', value: 'Option B' }, + { label: 'Option C', value: 'Option C' }, + ], + placeholder: '请选择', + // 弹窗会设置body的pointer-events为none,这回影响下拉框的点击事件 + popupClassName: 'pointer-events-auto', + }, + content: '此弹窗演示了如何使用component传递自定义组件', + icon: 'question', + modelPropName: 'value', + }).then((val) => { + if (val) { + alert(`你选择了${val}`); + } + }); +} + function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } @@ -44,7 +67,6 @@ function sleep(ms: number) { function showAsyncPrompt() { prompt({ async beforeClose(scope) { - console.log(scope); if (scope.isConfirm) { if (scope.value) { // 模拟异步操作,如果不成功,可以返回false @@ -75,6 +97,7 @@ function showAsyncPrompt() {