index.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <script>
  2. export default {
  3. name: "SuperForm",
  4. props: {
  5. value: {
  6. type: [Object],
  7. required: true,
  8. },
  9. dict: {
  10. type: [Object],
  11. required: true,
  12. },
  13. columns: {
  14. type: [Array],
  15. required: true,
  16. },
  17. },
  18. components: {
  19. ElFileUpload: () => import("@/components/FileUpload/index.vue"),
  20. ElPopoverSelectV2: () => import("@/components/popover-select-v2/index.vue"),
  21. ElPopoverMultipleSelectV2: () =>
  22. import("@/components/popover-select-v2/multiple.vue"),
  23. ElPopoverTreeSelect: () =>
  24. import("@/components/popover-tree-select/index.vue"),
  25. ElPopoverMultipleTreeSelect: () =>
  26. import("@/components/popover-tree-select/multiple.vue"),
  27. ElDateWrapper: () => import("@/components/date-wrapper/index.vue"),
  28. },
  29. data() {
  30. const { columns } = this.$props;
  31. const innerColumns = columns;
  32. return {
  33. drawer: false,
  34. visible: false,
  35. innerColumns: innerColumns,
  36. };
  37. },
  38. computed: {
  39. innerValue: {
  40. get() {
  41. return this.value;
  42. },
  43. set(value) {
  44. this.$emit("input", value);
  45. },
  46. },
  47. },
  48. watch: {},
  49. methods: {
  50. //
  51. getFormItemRequired(prop, value) {
  52. if (typeof prop.required === "function") {
  53. return prop.required(value);
  54. }
  55. if (typeof prop.required === "boolean") {
  56. return prop.required;
  57. }
  58. },
  59. //
  60. getFormItemDisabled(prop, value) {
  61. if (typeof prop.disabled === "function") {
  62. return prop.disabled(value);
  63. }
  64. if (typeof prop.disabled === "boolean") {
  65. return prop.disabled;
  66. }
  67. },
  68. // 继承el-table的Method
  69. extendMethod() {
  70. const refMethod = Object.entries(this.$refs["superForm"]);
  71. for (const [key, value] of refMethod) {
  72. if (!(key.includes("$") || key.includes("_"))) {
  73. this[key] = value;
  74. }
  75. }
  76. },
  77. },
  78. created() {},
  79. mounted() {
  80. this.extendMethod();
  81. },
  82. destroyed() {},
  83. };
  84. </script>
  85. <template>
  86. <el-form
  87. class="superForm"
  88. ref="superForm"
  89. v-bind="$attrs"
  90. v-on="$listeners"
  91. :model="innerValue"
  92. @submit.native.prevent
  93. >
  94. <el-row :gutter="24" style="display: flex; flex-wrap: wrap">
  95. <el-col
  96. v-for="({ item, attr }, index) in innerColumns"
  97. :key="index"
  98. :span="item.span"
  99. >
  100. <el-form-item
  101. :prop="item.key"
  102. :label="item.title"
  103. :required="getFormItemRequired(item, innerValue)"
  104. >
  105. <template #default="form">
  106. <slot :name="item.key" :row="innerValue" :item="item" :attr="attr">
  107. <component
  108. v-if="attr.is === 'el-select'"
  109. v-bind="attr"
  110. v-model="innerValue[item.key]"
  111. style="width: 100%"
  112. >
  113. <template>
  114. <el-option
  115. v-for="item in dict.type[attr.dictName]"
  116. :key="item.value"
  117. :label="item.label"
  118. :value="item.value"
  119. >
  120. </el-option>
  121. </template>
  122. </component>
  123. <component
  124. v-else-if="attr.is === 'el-popover-select-v2'"
  125. v-bind="attr"
  126. :title="item.title"
  127. v-model="innerValue[item.key]"
  128. :source.sync="innerValue"
  129. style="width: 100%"
  130. >
  131. </component>
  132. <component
  133. v-else-if="attr.is === 'el-popover-multiple-select-v2'"
  134. v-bind="attr"
  135. :title="item.title"
  136. v-model="innerValue[item.key]"
  137. :source.sync="innerValue"
  138. style="width: 100%"
  139. >
  140. </component>
  141. <component
  142. v-else-if="attr.is === 'el-popover-tree-select'"
  143. v-bind="attr"
  144. v-model="innerValue[item.key]"
  145. :source.sync="innerValue"
  146. style="width: 100%"
  147. >
  148. </component>
  149. <component
  150. v-else-if="attr.is === 'el-popover-multiple-tree-select'"
  151. v-bind="attr"
  152. v-model="innerValue[item.key]"
  153. :source.sync="innerValue"
  154. style="width: 100%"
  155. >
  156. </component>
  157. <component
  158. v-if="attr.is === 'el-date-wrapper'"
  159. v-bind="attr"
  160. v-model="innerValue[item.key]"
  161. :source.sync="innerValue"
  162. @change="$emit('submit')"
  163. style="width: 100%"
  164. >
  165. </component>
  166. <component
  167. v-else
  168. v-bind="attr"
  169. v-model="innerValue[item.key]"
  170. :disabled="getFormItemDisabled(attr, innerValue)"
  171. style="width: 100%"
  172. >
  173. </component>
  174. </slot>
  175. </template>
  176. </el-form-item>
  177. </el-col>
  178. </el-row>
  179. </el-form>
  180. </template>
  181. <style scoped>
  182. .superForm >>> .el-form-item {
  183. margin-bottom: 5px;
  184. }
  185. </style>