42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <template> | ||
|  |   <el-form ref="formRef" :model="modelValue" :rules="rules" :label-width="labelWidth" :label-position="labelPosition"> | ||
|  |     <el-row :gutter="gutter"> | ||
|  |       <form-items-renderer 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 "./form_items_renderer.vue"; | ||
|  | import { ElForm, ElRow } from "element-plus"; | ||
|  | import "element-plus/es/components/form/style/css"; | ||
|  | import "element-plus/es/components/row/style/css"; | ||
|  | 
 | ||
|  | 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: "120px" }, | ||
|  |   labelPosition: { type: String, default: "right" }, | ||
|  |   autoGenerateRequired: { type: Boolean, default: true }, | ||
|  | }); | ||
|  | 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> |