GenerateTabItem.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <template>
  2. <el-tabs v-model="tabActive"
  3. :type="element.options.type"
  4. :tab-position="element.options.tabPosition"
  5. :class="{
  6. [element.options.customClass]: element.options.customClass?true: false
  7. }"
  8. style="margin-bottom: 18px;"
  9. v-if="display[element.model]"
  10. >
  11. <el-tab-pane
  12. :key="item.name"
  13. :label="item.label"
  14. :name="item.name"
  15. v-for="item in element.tabs"
  16. >
  17. <template v-for="tab in item.list">
  18. <generate-col-item
  19. v-if="tab.type == 'grid'"
  20. :key="tab.key"
  21. :model.sync="dataModels"
  22. :rules="rules"
  23. :element="tab"
  24. :remote="remote"
  25. :blanks="blanks"
  26. :display="display"
  27. @input-change="onInputChange"
  28. :edit="edit"
  29. :remote-option="remoteOption"
  30. >
  31. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  32. <slot :name="blank.name" :model="scope.model"></slot>
  33. </template>
  34. </generate-col-item>
  35. <generate-tab-item
  36. v-else-if="tab.type == 'tabs'"
  37. :key="tab.key"
  38. :model.sync="dataModels"
  39. :rules="rules"
  40. :element="tab"
  41. :remote="remote"
  42. :blanks="blanks"
  43. :display="display"
  44. @input-change="onInputChange"
  45. :edit="edit"
  46. :remote-option="remoteOption"
  47. >
  48. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  49. <slot :name="blank.name" :model="scope.model"></slot>
  50. </template>
  51. </generate-tab-item>
  52. <generate-form-item
  53. v-else
  54. :key="tab.key"
  55. :models.sync="dataModels"
  56. :rules="rules"
  57. :widget="tab"
  58. :remote="remote"
  59. :blanks="blanks"
  60. :display="display"
  61. @input-change="onInputChange"
  62. :edit="edit"
  63. :remote-option="remoteOption"
  64. >
  65. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  66. <slot :name="blank.name" :model="scope.model"></slot>
  67. </template>
  68. </generate-form-item>
  69. </template>
  70. </el-tab-pane>
  71. </el-tabs>
  72. </template>
  73. <script>
  74. import GenerateFormItem from './GenerateFormItem'
  75. export default {
  76. name: 'generate-tab-item',
  77. components: {
  78. GenerateFormItem,
  79. GenerateColItem : () => import('./GenerateColItem.vue')
  80. },
  81. props: ['element', 'model', 'rules', 'remote', 'blanks', 'display', 'edit', 'remoteOption'],
  82. data () {
  83. return {
  84. dataModels: this.model,
  85. tabActive: this.element.tabs.length ? this.element.tabs[0].name : '',
  86. }
  87. },
  88. methods: {
  89. onInputChange (value, field) {
  90. this.$emit('input-change', value, field)
  91. }
  92. },
  93. watch: {
  94. model: {
  95. deep: true,
  96. handler (val) {
  97. this.dataModels = this.model
  98. }
  99. },
  100. dataModels: {
  101. deep: true,
  102. handler (val) {
  103. this.$emit('update:model', val)
  104. }
  105. }
  106. }
  107. }
  108. </script>