Browse Source

feat(data-form): 添加 CheckboxGroup组件并更新相关配置

- 新增 CheckboxGroup 组件,用于数据表单中的复选框组
- 在 DataFormConstant 中替换原有的 ElCheckboxGroup 为自定义的 CheckboxGroup
- 在示例页面 DataForm01.vue 中添加 CheckboxGroup 组件的使用演示
master
lizw-2015 6 months ago
parent
commit
b68ca72c4b
  1. 4
      src/components/data-form/DataFormConstant.ts
  2. 96
      src/components/data-form/inputs/CheckboxGroup.vue
  3. 5
      src/pages/DataForm01.vue

4
src/components/data-form/DataFormConstant.ts

@ -3,7 +3,6 @@ import {
ElAutocomplete, ElAutocomplete,
ElCascader, ElCascader,
ElCheckbox, ElCheckbox,
ElCheckboxGroup,
ElColorPicker, ElColorPicker,
ElDatePicker, ElDatePicker,
ElInput, ElInput,
@ -22,6 +21,7 @@ import {
ElTreeSelect, ElTreeSelect,
ElUpload, ElUpload,
} from "element-plus"; } from "element-plus";
import CheckboxGroup from "./inputs/CheckboxGroup.vue";
import RadioGroup from "./inputs/RadioGroup.vue"; import RadioGroup from "./inputs/RadioGroup.vue";
import type { DisplayMode } from "./DataFormTypes.ts"; import type { DisplayMode } from "./DataFormTypes.ts";
@ -30,7 +30,7 @@ const builtInInputComponents = {
Input: markRaw<any>(ElInput), Input: markRaw<any>(ElInput),
InputNumber: markRaw<any>(ElInputNumber), InputNumber: markRaw<any>(ElInputNumber),
Checkbox: markRaw<any>(ElCheckbox), Checkbox: markRaw<any>(ElCheckbox),
CheckboxGroup: markRaw<any>(ElCheckboxGroup), CheckboxGroup: markRaw<any>(CheckboxGroup),
Radio: markRaw<any>(ElRadio), Radio: markRaw<any>(ElRadio),
RadioGroup: markRaw<any>(RadioGroup), RadioGroup: markRaw<any>(RadioGroup),
Switch: markRaw<any>(ElSwitch), Switch: markRaw<any>(ElSwitch),

96
src/components/data-form/inputs/CheckboxGroup.vue

@ -0,0 +1,96 @@
<script setup lang="ts">
import lodash from "lodash";
import { computed, createVNode, defineExpose, onMounted, reactive, useAttrs, useSlots, useTemplateRef } from "vue";
import { ElCheckbox, ElCheckboxGroup } from "element-plus";
import { Typeof } from "@ease-forge/shared";
import { mergeExpose } from "../DataFormUtils.tsx";
defineOptions({
name: 'CheckboxGroup',
});
//
const attrs = useAttrs();
//
const slots = useSlots();
interface OptionItem {
value: string | number | boolean;
label: string;
[key: string]: any;
}
// Props
interface CheckboxGroupProps {
options?: Array<OptionItem>;
}
// props
const props = withDefaults(defineProps<CheckboxGroupProps>(), {
options: () => ([]),
});
// State
interface CheckboxGroupState {
}
// state
const state = reactive<CheckboxGroupState>({
loading: false,
});
//
const input = useTemplateRef<InstanceType<typeof ElCheckboxGroup>>("inputRef");
//
const options = computed(() => {
let opts: Array<OptionItem> = [];
let options = props.options;
if (options) {
if (Typeof.isArray(options)) {
opts = options;
} else {
console.log("options 配置必须是数组类型");
}
}
return opts;
});
// props
const inputProps = computed<any>(() => {
const res: any = { ...attrs };
if (Typeof.hasValue(res.modelValue) && !Typeof.isStr(res.modelValue)) res.modelValue = lodash.toString(res.modelValue);
return res;
});
function toString(val: any) {
if (Typeof.hasValue(val) && !Typeof.isStr(val)) return lodash.toString(val);
return val;
}
const expose = {
/** 组件状态 */
state,
};
onMounted(() => {
if (input.value) mergeExpose(expose, input.value);
});
//
defineExpose(expose);
export type {
OptionItem,
CheckboxGroupProps,
CheckboxGroupState,
}
</script>
<template>
<component ref="inputRef" :is="createVNode(ElCheckboxGroup, inputProps, slots)">
<ElCheckbox v-for="(item, idx) in options" v-bind="item" :value="toString(item.value)"/>
</component>
</template>
<style scoped>
</style>

5
src/pages/DataForm01.vue

@ -93,7 +93,10 @@ const dataForm1 = reactive<DataFormProps>({
dataPath: 'checkbox_group_1', label: '复选组', input: 'CheckboxGroup', dataPath: 'checkbox_group_1', label: '复选组', input: 'CheckboxGroup',
inputProps: { inputProps: {
max: 2, max: 2,
// TODO options options: [
{ value: "001", label: "选项1" },
{ value: "v2", label: "选项2" },
],
}, },
}, },
{ {

Loading…
Cancel
Save