AdvancedForm.vue 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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] =
  17. res[element.name] !== undefined && element.value !== undefined ? res[element.name] : element.value
  18. })
  19. })
  20. console.log(res)
  21. return res
  22. }
  23. })
  24. </script>
  25. <template>
  26. <el-card
  27. v-for="(item, index) in formConfig.formItems"
  28. :key="index"
  29. :header="item.label"
  30. class="mb-16px"
  31. shadow="never"
  32. >
  33. <el-row :gutter="20">
  34. <el-col :span="sub.span || formConfig.span || 12" v-for="(sub, key) in item.group" :key="key">
  35. <el-form-item :label="sub.label" :rules="sub.rules" :prop="sub.name">
  36. <form-comp :item="sub" v-model="formData[sub.name]">
  37. <template #[slot.alias]="slotProps" v-for="slot in sub.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. </el-card>
  45. </template>
  46. <style lang="scss" scoped></style>