GenerateForm.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div class="fm-style">
  3. <el-form ref="generateForm"
  4. label-suffix=":"
  5. :size="data.config.size"
  6. :model="models" :rules="rules" :label-position="data.config.labelPosition" :label-width="data.config.labelWidth + 'px'">
  7. <template v-for="item in data.list">
  8. <template v-if="item.type == 'grid'">
  9. <el-row
  10. :key="item.key"
  11. type="flex"
  12. :gutter="item.options.gutter ? item.options.gutter : 0"
  13. :justify="item.options.justify"
  14. :align="item.options.align"
  15. >
  16. <el-col v-for="(col, colIndex) in item.columns" :key="colIndex" :span="col.span">
  17. <template v-for="citem in col.list" >
  18. <el-form-item v-if="citem.type=='blank'" :label="citem.name" :prop="citem.model" :key="citem.key">
  19. <slot :name="citem.model" :model="models"></slot>
  20. </el-form-item>
  21. <genetate-form-item v-else
  22. :key="citem.key"
  23. :models.sync="models"
  24. :remote="remote"
  25. :rules="rules"
  26. :widget="citem"
  27. @input-change="onInputChange">
  28. </genetate-form-item>
  29. </template>
  30. </el-col>
  31. </el-row>
  32. </template>
  33. <template v-else-if="item.type == 'blank'">
  34. <el-form-item :label="item.name" :prop="item.model" :key="item.key">
  35. <slot :name="item.model" :model="models"></slot>
  36. </el-form-item>
  37. </template>
  38. <template v-else>
  39. <genetate-form-item
  40. :key="item.key"
  41. :models.sync="models"
  42. :rules="rules"
  43. :widget="item"
  44. @input-change="onInputChange"
  45. :remote="remote">
  46. </genetate-form-item>
  47. </template>
  48. </template>
  49. </el-form>
  50. </div>
  51. </template>
  52. <script>
  53. import GenetateFormItem from './GenerateFormItem'
  54. import {loadJs} from '../util/index.js'
  55. export default {
  56. name: 'fm-generate-form',
  57. components: {
  58. GenetateFormItem
  59. },
  60. props: ['data', 'remote', 'value', 'insite'],
  61. data () {
  62. return {
  63. models: {},
  64. rules: {}
  65. }
  66. },
  67. created () {
  68. console.log(this.data)
  69. this.generateModle(this.data.list)
  70. },
  71. mounted () {
  72. },
  73. methods: {
  74. generateModle (genList) {
  75. console.log(genList)
  76. for (let i = 0; i < genList.length; i++) {
  77. if (genList[i].type === 'grid') {
  78. genList[i].columns.forEach(item => {
  79. this.generateModle(item.list)
  80. })
  81. } else {
  82. if (this.value && Object.keys(this.value).indexOf(genList[i].model) >= 0) {
  83. this.models[genList[i].model] = this.value[genList[i].model]
  84. } else {
  85. if (genList[i].type === 'blank') {
  86. this.$set(this.models, genList[i].model, genList[i].options.defaultType === 'String' ? '' : (genList[i].options.defaultType === 'Object' ? {} : []))
  87. } else {
  88. this.models[genList[i].model] = genList[i].options.defaultValue
  89. }
  90. }
  91. if (this.rules[genList[i].model]) {
  92. this.rules[genList[i].model] = [...this.rules[genList[i].model], ...genList[i].rules.map(item => {
  93. if (item.pattern) {
  94. return {...item, pattern: new RegExp(item.pattern)}
  95. } else {
  96. return {...item}
  97. }
  98. })]
  99. } else {
  100. this.rules[genList[i].model] = [...genList[i].rules.map(item => {
  101. if (item.pattern) {
  102. return {...item, pattern: new RegExp(item.pattern)}
  103. } else {
  104. return {...item}
  105. }
  106. })]
  107. }
  108. }
  109. }
  110. },
  111. getData () {
  112. console.log(this.models)
  113. return new Promise((resolve, reject) => {
  114. this.$refs.generateForm.validate(valid => {
  115. if (valid) {
  116. resolve(this.models)
  117. } else {
  118. reject(new Error(this.$t('fm.message.validError')).message)
  119. }
  120. })
  121. })
  122. },
  123. reset () {
  124. this.$refs.generateForm.resetFields()
  125. },
  126. onInputChange (value, field) {
  127. this.$emit('on-change', field, value, this.models)
  128. },
  129. refresh () {
  130. }
  131. },
  132. watch: {
  133. data: {
  134. deep: true,
  135. handler (val) {
  136. this.generateModle(val.list)
  137. }
  138. },
  139. value: {
  140. deep: true,
  141. handler (val) {
  142. console.log(JSON.stringify(val))
  143. this.models = {...this.models, ...val}
  144. }
  145. }
  146. }
  147. }
  148. </script>
  149. <style lang="scss">
  150. // @import '../styles/cover.scss';
  151. </style>