ElFormLayout.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <script setup lang="ts">
  2. import type { BasicForm, BasicFormItem } from '@/types/form'
  3. import { containerTypes } from '@/utils/constants'
  4. interface Props {
  5. formItem: BasicFormItem
  6. formConfig: BasicForm
  7. formData: any
  8. }
  9. const props = defineProps<Props>()
  10. const children = computed(() => {
  11. return props.formItem.children?.filter(item => !item.hidden)
  12. })
  13. </script>
  14. <template>
  15. <el-row :gutter="20">
  16. <el-col :span="item.span" v-bind="item.props" v-for="(item, index) in children" :key="index">
  17. <component
  18. :is="'el-' + item.type"
  19. v-if="containerTypes.includes(item.type)"
  20. v-model="item.value"
  21. v-bind="item.props"
  22. :children="item.children"
  23. :formItem="item"
  24. :formData="formData"
  25. :formConfig="formConfig"
  26. v-on="item.events || {}"
  27. >
  28. <template #[slot.alias]="slotProps" v-for="slot in item.slots" :key="slot.alias">
  29. <slot :name="slot.alias" v-bind="slotProps"></slot>
  30. </template>
  31. </component>
  32. <template v-else>
  33. <el-row :gutter="20">
  34. <el-col v-for="child in item.children" :span="child.span || formConfig.span || 12" v-show="!child.hidden">
  35. <el-form-item :label="child.label" :rules="child.rules" :prop="child.name">
  36. <form-comp :item="child" v-model="formData[child.name]">
  37. <template #[slot.alias]="slotProps" v-for="slot in child.slots" :key="slot.alias">
  38. <slot :name="slot.alias" v-bind="slotProps"></slot>
  39. </template>
  40. </form-comp>
  41. </el-form-item>
  42. </el-col>
  43. </el-row>
  44. </template>
  45. </el-col>
  46. </el-row>
  47. </template>
  48. <style lang="scss" scoped></style>