docking-vue/src/components/form_builder/index.vue

67 lines
1.4 KiB
Vue
Raw Normal View History

2025-07-21 11:32:02 +08:00
<template>
<el-form
ref="formRef"
:model="modelValue"
:rules="rules"
:label-width="labelWidth"
:label-position="labelPosition"
>
<el-row :gutter="gutter">
<form-items-renderer
v-if="options && options.length"
v-model="modelValue"
:options="options"
:span="span"
>
<template v-for="(_, name) in slots" :key="name" #[name]="slotProps">
<slot :name="name" v-bind="slotProps" />
</template>
</form-items-renderer>
</el-row>
</el-form>
</template>
<script setup>
import { useSlots, useTemplateRef } from "vue";
import FormItemsRenderer from "@/components/form_builder/form_items_renderer.vue";
const slots = useSlots();
defineOptions({
name: "AppFormBuilder",
});
defineProps({
options: {
type: Array,
required: true,
},
rules: {
type: Object,
default: () => ({}),
},
gutter: {
type: Number,
default: 24,
},
span: {
type: Number,
default: 0,
},
labelWidth: {
type: [Number, String],
default: "100px",
},
labelPosition: {
type: String,
default: "right",
},
});
const modelValue = defineModel({ type: Object, required: true });
const formRef = useTemplateRef("formRef");
defineExpose({
validate: (callback) => formRef.value.validate(callback),
resetFields: () => formRef.value.resetFields(),
});
</script>
<style scoped lang="scss"></style>