FormGroup.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <template>
  2. <div :class="[
  3. 'dynamic-form-group',
  4. {
  5. 'collapsed': collapsed,
  6. 'collapsible': collapsible,
  7. 'plain': plain,
  8. }
  9. ]">
  10. <h5 v-if="title" @click="collapsible ? collapsed = !collapsed : null">
  11. <span>{{ title }}</span>
  12. <view>
  13. <span v-if="collapsed">点击展开更多</span>
  14. <IconDown v-if="collapsible" class="collapsible-icon" />
  15. </view>
  16. </h5>
  17. <Row v-if="!collapsed" :justify="(justify as any)" :gutter="gutter">
  18. <slot />
  19. </Row>
  20. </div>
  21. </template>
  22. <script lang="ts" setup>
  23. import { ref } from "vue";
  24. import Row from "@/components/layout/grid/Row.vue";
  25. import IconDown from "../Images/IconDown.vue";
  26. const props = defineProps({
  27. /**
  28. * 标题
  29. */
  30. title: {
  31. type: String,
  32. default: "",
  33. },
  34. /**
  35. * 栅格间隔 px
  36. */
  37. gutter: {
  38. type: Number,
  39. default: null,
  40. },
  41. /**
  42. * flex 布局下的水平排列方式:start end center space-around space-between
  43. */
  44. justify: {
  45. type: String,
  46. default: "start",
  47. },
  48. /**
  49. * 是否可折叠
  50. */
  51. collapsible: {
  52. type: Boolean,
  53. default: false,
  54. },
  55. /**
  56. * 是否为朴素样式
  57. */
  58. plain: {
  59. type: Boolean,
  60. default: false,
  61. },
  62. /**
  63. * 是否默认折叠
  64. */
  65. collapsed: {
  66. type: Boolean,
  67. default: false,
  68. },
  69. });
  70. const collapsed = ref(props.collapsed);
  71. </script>
  72. <style lang="scss">
  73. .dynamic-form-group {
  74. padding: 10px 0;
  75. background-color: var(--dynamic-form-background-color);
  76. border-radius: var(--dynamic-form-border-radius);
  77. &.collapsed {
  78. .collapsible-icon {
  79. transform: rotate(0deg);
  80. }
  81. }
  82. &.collapsible {
  83. h5 {
  84. cursor: pointer;
  85. }
  86. }
  87. .collapsible-icon {
  88. transform: rotate(180deg);
  89. transition: transform 0.3s ease-in-out;
  90. width: 16px;
  91. height: 16px;
  92. }
  93. h5 {
  94. display: flex;
  95. align-items: center;
  96. justify-content: space-between;
  97. color: var(--dynamic-form-text-color);
  98. margin: 0;
  99. margin-bottom: 12px;
  100. view {
  101. display: flex;
  102. align-items: center;
  103. span {
  104. font-size: 11px;
  105. margin-right: 10rpx;
  106. color: var(--dynamic-form-secondary-color);
  107. }
  108. }
  109. }
  110. &.plain {
  111. padding: 0;
  112. background-color: transparent;
  113. }
  114. }
  115. </style>