|
@@ -0,0 +1,194 @@
|
|
|
+<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>
|