123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <script lang="ts" setup>
- import type { Recordable } from '@vben/types';
- import { reactive, ref } from 'vue';
- import {
- Page,
- VbenButton,
- VbenButtonGroup,
- VbenCheckButtonGroup,
- } from '@vben/common-ui';
- import { Button, Card, message } from 'ant-design-vue';
- import { useVbenForm } from '#/adapter/form';
- const radioValue = ref<string | undefined>('a');
- const checkValue = ref(['a', 'b']);
- const options = [
- { label: '选项1', value: 'a' },
- { label: '选项2', value: 'b' },
- { label: '选项3', value: 'c' },
- { label: '选项4', value: 'd' },
- { label: '选项5', value: 'e' },
- { label: '选项6', value: 'f' },
- ];
- function resetValues() {
- radioValue.value = undefined;
- checkValue.value = [];
- }
- function beforeChange(v: any, isChecked: boolean) {
- return new Promise((resolve) => {
- message.loading({
- content: `正在设置${v}为${isChecked ? '选中' : '未选中'}...`,
- duration: 0,
- key: 'beforeChange',
- });
- setTimeout(() => {
- message.success({ content: `${v} 已设置成功`, key: 'beforeChange' });
- resolve(true);
- }, 2000);
- });
- }
- const compProps = reactive({
- beforeChange: undefined,
- disabled: false,
- gap: 0,
- showIcon: true,
- size: 'middle',
- } as Recordable<any>);
- const [Form] = useVbenForm({
- handleValuesChange(values) {
- Object.keys(values).forEach((k) => {
- if (k === 'beforeChange') {
- compProps[k] = values[k] ? beforeChange : undefined;
- } else {
- compProps[k] = values[k];
- }
- });
- },
- schema: [
- {
- component: 'RadioGroup',
- componentProps: {
- options: [
- { label: '大', value: 'large' },
- { label: '中', value: 'middle' },
- { label: '小', value: 'small' },
- ],
- },
- defaultValue: compProps.size,
- fieldName: 'size',
- label: '尺寸',
- },
- {
- component: 'RadioGroup',
- componentProps: {
- options: [
- { label: '无', value: 0 },
- { label: '小', value: 5 },
- { label: '中', value: 15 },
- { label: '大', value: 30 },
- ],
- },
- defaultValue: compProps.gap,
- fieldName: 'gap',
- label: '间距',
- },
- {
- component: 'Switch',
- defaultValue: compProps.showIcon,
- fieldName: 'showIcon',
- label: '显示图标',
- },
- {
- component: 'Switch',
- defaultValue: compProps.disabled,
- fieldName: 'disabled',
- label: '禁用',
- },
- {
- component: 'Switch',
- defaultValue: false,
- fieldName: 'beforeChange',
- label: '前置回调',
- },
- ],
- showDefaultActions: false,
- submitOnChange: true,
- });
- function onBtnClick(value: any) {
- const opt = options.find((o) => o.value === value);
- if (opt) {
- message.success(`点击了按钮${opt.label},value = ${value}`);
- }
- }
- </script>
- <template>
- <Page
- title="VbenButtonGroup 按钮组"
- description="VbenButtonGroup是一个按钮容器,用于包裹一组按钮,协调整体样式。VbenCheckButtonGroup则可以作为一个表单组件,提供单选或多选功能"
- >
- <Card title="基本用法">
- <template #extra>
- <Button type="primary" @click="resetValues">清空值</Button>
- </template>
- <p class="mt-4">按钮组:</p>
- <div class="mt-2 flex flex-col gap-2">
- <VbenButtonGroup v-bind="compProps" border>
- <VbenButton
- v-for="btn in options"
- :key="btn.value"
- variant="link"
- @click="onBtnClick(btn.value)"
- >
- {{ btn.label }}
- </VbenButton>
- </VbenButtonGroup>
- <VbenButtonGroup v-bind="compProps" border>
- <VbenButton
- v-for="btn in options"
- :key="btn.value"
- variant="outline"
- @click="onBtnClick(btn.value)"
- >
- {{ btn.label }}
- </VbenButton>
- </VbenButtonGroup>
- </div>
- <p class="mt-4">单选:{{ radioValue }}</p>
- <div class="mt-2 flex flex-col gap-2">
- <VbenCheckButtonGroup
- v-model="radioValue"
- :options="options"
- v-bind="compProps"
- />
- </div>
- <p class="mt-4">单选插槽:{{ radioValue }}</p>
- <div class="mt-2 flex flex-col gap-2">
- <VbenCheckButtonGroup
- v-model="radioValue"
- :options="options"
- v-bind="compProps"
- >
- <template #option="{ label, value }">
- <div class="flex items-center">
- <span>{{ label }}</span>
- <span class="ml-2 text-gray-400">{{ value }}</span>
- </div>
- </template>
- </VbenCheckButtonGroup>
- </div>
- <p class="mt-4">多选{{ checkValue }}</p>
- <div class="mt-2 flex flex-col gap-2">
- <VbenCheckButtonGroup
- v-model="checkValue"
- multiple
- :options="options"
- v-bind="compProps"
- />
- </div>
- </Card>
- <Card title="设置" class="mt-4">
- <Form />
- </Card>
- </Page>
- </template>
|