AdvancedForm.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <script setup lang="ts">
  2. import type { AdvancedForm } from '@/types/form'
  3. interface Props {
  4. formConfig: AdvancedForm
  5. formData: any
  6. }
  7. const props = defineProps<Props>()
  8. const formData = computed(() => {
  9. if (props.formData.id) {
  10. return props.formData
  11. } else {
  12. const res = props.formData
  13. props.formConfig?.formItems.forEach(item => {
  14. item.group.forEach(element => {
  15. // 避免修改当前表单项value重置其他表单项的value
  16. res[element.name] = res[element.name] && element.value !== undefined ? res[element.name] : element.value
  17. })
  18. })
  19. console.log(res)
  20. return res
  21. }
  22. })
  23. </script>
  24. <template>
  25. <el-card
  26. v-for="(item, index) in formConfig.formItems"
  27. :key="index"
  28. :header="item.label"
  29. class="mb-16px"
  30. shadow="never"
  31. >
  32. <el-row :gutter="20">
  33. <el-col :span="sub.span || formConfig.span || 12" v-for="(sub, key) in item.group" :key="key">
  34. <el-form-item :label="sub.label" :rules="sub.rules" :prop="sub.name">
  35. <form-comp :item="sub" v-model="formData[sub.name]">
  36. <template #[slot.alias]="slotProps" v-for="slot in sub.slots" :key="slot.alias">
  37. <slot :name="slot.alias" v-bind="slotProps"></slot>
  38. </template>
  39. </form-comp>
  40. </el-form-item>
  41. </el-col>
  42. </el-row>
  43. </el-card>
  44. </template>
  45. <style lang="scss" scoped></style>