|
@@ -0,0 +1,120 @@
|
|
|
+<template>
|
|
|
+ <Form :model="formModel" ref="formRef" layout="horizontal">
|
|
|
+ <FormItem
|
|
|
+ v-for="item in formItems"
|
|
|
+ :key="item.key"
|
|
|
+ :label="item.label"
|
|
|
+ :name="item.key"
|
|
|
+ :rules="item.rules"
|
|
|
+ >
|
|
|
+ <template v-if="item.type === 'input'">
|
|
|
+ <Input v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'select'">
|
|
|
+ <Select v-model="formModel[item.key]" :options="item.options" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'inputnumber'">
|
|
|
+ <InputNumber v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'image'">
|
|
|
+ <Image v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'checkbox'">
|
|
|
+ <Checkbox v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'backgroundSelect'">
|
|
|
+ <BackgroundSelect v-model:background="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <!-- <template v-else-if="item.type === 'boderSelect'">
|
|
|
+ <BoderSelect v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'boderRadiusSelect'">
|
|
|
+ <BoderRadiusSelect v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'shodowSelect'">
|
|
|
+ <ShodowSelect v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'paddingSelect'">
|
|
|
+ <PaddingSelect v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'rotateSelect'">
|
|
|
+ <RotateSelect v-model="formModel[item.key]" />
|
|
|
+ </template>
|
|
|
+ <template v-else-if="item.type === 'opacitySelect'">
|
|
|
+ <OpacitySelect v-model="formModel[item.key]" />
|
|
|
+ </template> -->
|
|
|
+ </FormItem>
|
|
|
+ </Form>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import type { FormInstance } from "ant-design-vue";
|
|
|
+import { ref, defineProps, defineExpose, computed, watch } from "vue";
|
|
|
+import {
|
|
|
+ Form,
|
|
|
+ FormItem,
|
|
|
+ Input,
|
|
|
+ Select,
|
|
|
+ InputNumber,
|
|
|
+ Checkbox,
|
|
|
+ Image,
|
|
|
+} from "ant-design-vue";
|
|
|
+import BackgroundSelect from "./BackgroundSelect.vue";
|
|
|
+
|
|
|
+interface FormItem {
|
|
|
+ label: string;
|
|
|
+ key: string;
|
|
|
+ type:
|
|
|
+ | "input"
|
|
|
+ | "select"
|
|
|
+ | "inputnumber"
|
|
|
+ | "image"
|
|
|
+ | "checkbox"
|
|
|
+ | "backgroundSelect" // 背景选择
|
|
|
+ | "boderSelect" // 边框选择
|
|
|
+ | "boderRadiusSelect" // 边框圆角选择
|
|
|
+ | "shodowSelect" // 阴影选择
|
|
|
+ | "paddingSelect" // 内边距选择
|
|
|
+ | "rotateSelect" // 旋转选择
|
|
|
+ | "opacitySelect"; // 透明度选择
|
|
|
+ options?: any[];
|
|
|
+ prefix?: string;
|
|
|
+ suffix?: string;
|
|
|
+ rules?: any[];
|
|
|
+ defaultValue?: any;
|
|
|
+}
|
|
|
+
|
|
|
+const props = defineProps<{
|
|
|
+ columns: FormItem[];
|
|
|
+ formModel: Record<string, any>;
|
|
|
+}>();
|
|
|
+
|
|
|
+const formModel = ref<Record<string, any>>({});
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+
|
|
|
+const formItems = computed(() => {
|
|
|
+ return props.columns.map((item) => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ rules: item.rules || [],
|
|
|
+ };
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => props.columns,
|
|
|
+ () => {
|
|
|
+ props.columns.forEach((item) => {
|
|
|
+ formModel.value[item.key] = item?.defaultValue;
|
|
|
+ if (props.formModel[item.key] !== undefined) {
|
|
|
+ formModel.value[item.key] = props.formModel[item.key];
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+)
|
|
|
+
|
|
|
+defineExpose(formRef.value);
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped></style>
|