ComponentContainerProperty.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <el-tabs stretch>
  3. <!-- 每个组件的自定义内容 -->
  4. <el-tab-pane label="内容" v-if="$slots.default">
  5. <slot></slot>
  6. </el-tab-pane>
  7. <!-- 每个组件的通用内容 -->
  8. <el-tab-pane label="样式" lazy>
  9. <el-card header="组件样式" class="property-group">
  10. <el-form :model="formData" label-width="80px">
  11. <el-form-item label="组件背景" prop="bgType">
  12. <el-radio-group v-model="formData.bgType">
  13. <el-radio value="color">纯色</el-radio>
  14. <el-radio value="img">图片</el-radio>
  15. </el-radio-group>
  16. </el-form-item>
  17. <el-form-item label="选择颜色" prop="bgColor" v-if="formData.bgType === 'color'">
  18. <ColorInput v-model="formData.bgColor" />
  19. </el-form-item>
  20. <el-form-item label="上传图片" prop="bgImg" v-else>
  21. <UploadImg v-model="formData.bgImg" :limit="1">
  22. <template #tip>建议宽度 750px</template>
  23. </UploadImg>
  24. </el-form-item>
  25. <el-tree :data="treeData" :expand-on-click-node="false" default-expand-all>
  26. <template #default="{ node, data }">
  27. <el-form-item
  28. :label="data.label"
  29. :prop="data.prop"
  30. :label-width="node.level === 1 ? '80px' : '62px'"
  31. class="w-full m-b-0!"
  32. >
  33. <el-slider
  34. v-model="formData[data.prop]"
  35. :max="100"
  36. :min="0"
  37. show-input
  38. input-size="small"
  39. :show-input-controls="false"
  40. @input="handleSliderChange(data.prop)"
  41. />
  42. </el-form-item>
  43. </template>
  44. </el-tree>
  45. <slot name="style" :style="formData"></slot>
  46. </el-form>
  47. </el-card>
  48. </el-tab-pane>
  49. </el-tabs>
  50. </template>
  51. <script setup lang="ts">
  52. import { ComponentStyle, usePropertyForm } from '@/components/DiyEditor/util'
  53. /**
  54. * 组件容器属性:目前右边部分
  55. * 用于包裹组件,为组件提供 背景、外边距、内边距、边框等样式
  56. */
  57. defineOptions({ name: 'ComponentContainer' })
  58. const props = defineProps<{ modelValue: ComponentStyle }>()
  59. const emit = defineEmits(['update:modelValue'])
  60. const { formData } = usePropertyForm(props.modelValue, emit)
  61. const treeData = [
  62. {
  63. label: '外部边距',
  64. prop: 'margin',
  65. children: [
  66. {
  67. label: '上',
  68. prop: 'marginTop'
  69. },
  70. {
  71. label: '右',
  72. prop: 'marginRight'
  73. },
  74. {
  75. label: '下',
  76. prop: 'marginBottom'
  77. },
  78. {
  79. label: '左',
  80. prop: 'marginLeft'
  81. }
  82. ]
  83. },
  84. {
  85. label: '内部边距',
  86. prop: 'padding',
  87. children: [
  88. {
  89. label: '上',
  90. prop: 'paddingTop'
  91. },
  92. {
  93. label: '右',
  94. prop: 'paddingRight'
  95. },
  96. {
  97. label: '下',
  98. prop: 'paddingBottom'
  99. },
  100. {
  101. label: '左',
  102. prop: 'paddingLeft'
  103. }
  104. ]
  105. },
  106. {
  107. label: '边框圆角',
  108. prop: 'borderRadius',
  109. children: [
  110. {
  111. label: '上左',
  112. prop: 'borderTopLeftRadius'
  113. },
  114. {
  115. label: '上右',
  116. prop: 'borderTopRightRadius'
  117. },
  118. {
  119. label: '下右',
  120. prop: 'borderBottomRightRadius'
  121. },
  122. {
  123. label: '下左',
  124. prop: 'borderBottomLeftRadius'
  125. }
  126. ]
  127. }
  128. ]
  129. const handleSliderChange = (prop: string) => {
  130. switch (prop) {
  131. case 'margin':
  132. formData.value.marginTop = formData.value.margin
  133. formData.value.marginRight = formData.value.margin
  134. formData.value.marginBottom = formData.value.margin
  135. formData.value.marginLeft = formData.value.margin
  136. break
  137. case 'padding':
  138. formData.value.paddingTop = formData.value.padding
  139. formData.value.paddingRight = formData.value.padding
  140. formData.value.paddingBottom = formData.value.padding
  141. formData.value.paddingLeft = formData.value.padding
  142. break
  143. case 'borderRadius':
  144. formData.value.borderTopLeftRadius = formData.value.borderRadius
  145. formData.value.borderTopRightRadius = formData.value.borderRadius
  146. formData.value.borderBottomRightRadius = formData.value.borderRadius
  147. formData.value.borderBottomLeftRadius = formData.value.borderRadius
  148. break
  149. }
  150. }
  151. </script>
  152. <style scoped lang="scss">
  153. :deep(.el-slider__runway) {
  154. margin-right: 16px;
  155. }
  156. :deep(.el-input-number) {
  157. width: 50px;
  158. }
  159. </style>