ElFormTabs.vue 2.0 KB

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