DynamicFormCate.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <view
  3. v-if="formDefine.type === 'group'"
  4. :class="`form-group ${formDefine.props.type}`"
  5. >
  6. <text class="form-group-title" v-if="formDefineParentLabel">
  7. {{ formDefineParentLabel }}
  8. </text>
  9. <DynamicFormCateInner
  10. :formDefine="formDefine"
  11. :formModel="formModel"
  12. :groupType="formDefine.props.type"
  13. />
  14. </view>
  15. <DynamicFormCateInner
  16. v-else
  17. :formDefine="formDefine"
  18. :formModel="formModel"
  19. />
  20. </template>
  21. <script setup lang="ts">
  22. import type { PropType } from 'vue';
  23. import type { FormDefine } from '.';
  24. import DynamicFormCateInner from './DynamicFormCateInner.vue';
  25. export interface FormGroupProps {
  26. type: 'row' | 'column' | 'block';
  27. }
  28. const props = defineProps({
  29. formDefineParentLabel: {
  30. type: null,
  31. default: ''
  32. },
  33. formDefineParentKey: {
  34. type: String,
  35. default: ''
  36. },
  37. formModel: {
  38. type: Object,
  39. default: () => ({})
  40. },
  41. formDefine: {
  42. type: Object as PropType<FormDefine>,
  43. default: () => ({})
  44. },
  45. })
  46. </script>
  47. <style lang="scss">
  48. .form-group {
  49. display: flex;
  50. flex-direction: column;
  51. &.block {
  52. margin-bottom: 32rpx;
  53. padding: 24rpx 0;
  54. background: #fff;
  55. border-radius: 10rpx;
  56. .form-group-title {
  57. display: block;
  58. font-size: 28rpx;
  59. color: #333;
  60. margin-bottom: 16rpx;
  61. }
  62. }
  63. .form-group-title {
  64. display: block;
  65. flex-shrink: 0;
  66. font-size: 28rpx;
  67. color: #333;
  68. margin-bottom: 16rpx;
  69. margin-left: 26rpx;
  70. }
  71. &.row {
  72. flex-direction: row;
  73. justify-content: space-between;
  74. align-items: center;
  75. .form-group-title {
  76. display: inline-block;
  77. margin-left: 30rpx;
  78. }
  79. }
  80. }
  81. </style>