ExtForm.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <template>
  2. <div class="dynamic-form-container layout-pd">
  3. <el-card shadow="hover">
  4. <el-form
  5. :model="form"
  6. :rules="rules"
  7. ref="formRulesOneRef"
  8. size="default" label-width="0px" class="mt35">
  9. <el-row :gutter="35">
  10. <el-col
  11. :xs="val.xs"
  12. :sm="val.sm"
  13. :md="val.md"
  14. :lg="val.md"
  15. :xl="val.xl"
  16. class="mb20"
  17. v-for="(val, key) in state.cols"
  18. :key="key">
  19. <template v-if="val.type !== ''">
  20. <el-form-item
  21. :label="val.label"
  22. :prop="val.prop"
  23. :rules="[{ required: val.required, message: `${val.label}不能为空`, trigger: val.type === 'input' ? 'blur' : 'change' }]"
  24. v-if="val.type !== ''">
  25. <el-input
  26. v-if="val.type === 'text'"
  27. v-model="form[val.prop]"
  28. :placeholder="val.placeholder"
  29. clearable
  30. style="width: 100%"
  31. :disabled="val.disabled">
  32. </el-input>
  33. <el-date-picker
  34. v-model="form[val.prop]"
  35. type="date"
  36. :placeholder="val.placeholder"
  37. v-else-if="val.type === 'date'"
  38. style="width: 100%"
  39. :disabled="val.disabled"
  40. >
  41. </el-date-picker>
  42. <el-select
  43. v-model="form[val.prop]"
  44. :placeholder="val.placeholder"
  45. v-else-if="val.type === 'select'"
  46. style="width: 100%"
  47. :disabled="val.disabled"
  48. >
  49. <el-option v-for="item in val.options" :key="item.value" :label="item.label"
  50. :value="item.value"></el-option>
  51. </el-select>
  52. <el-input
  53. type="textarea"
  54. v-model="form[val.prop]"
  55. :placeholder="val.placeholder"
  56. clearable
  57. v-if="val.type === 'textarea'"
  58. style="width: 100%"
  59. :disabled="val.disabled"
  60. ></el-input>
  61. </el-form-item>
  62. </template>
  63. <template v-else>
  64. <el-row :gutter="35" v-for="(v, k) in form.list" :key="k">
  65. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  66. <el-form-item label="年度" :prop="`list[${k}].year`"
  67. :rules="[{ required: true, message: `年度不能为空`, trigger: 'blur' }]">
  68. <template #label>
  69. <el-button type="primary" circle size="small" @click="onAddRow" v-if="k === 0">
  70. <el-icon>
  71. <ele-Plus/>
  72. </el-icon>
  73. </el-button>
  74. <el-button type="danger" circle size="small" @click="onDelRow(k)" v-else>
  75. <el-icon>
  76. <ele-Delete/>
  77. </el-icon>
  78. </el-button>
  79. <span class="ml10">年度</span>
  80. </template>
  81. <el-input v-model="form.list[k].year" style="width: 100%" placeholder="请输入"></el-input>
  82. </el-form-item>
  83. </el-col>
  84. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  85. <el-form-item label="月度" :prop="`list[${k}].month`"
  86. :rules="[{ required: true, message: `月度不能为空`, trigger: 'blur' }]">
  87. <el-input v-model="form.list[k].month" style="width: 100%" placeholder="请输入"></el-input>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
  91. <el-form-item label="日度" :prop="`list[${k}].day`"
  92. :rules="[{ required: true, message: `日度不能为空`, trigger: 'blur' }]">
  93. <el-input v-model="form.list[k].day" style="width: 100%" placeholder="请输入"></el-input>
  94. </el-form-item>
  95. </el-col>
  96. </el-row>
  97. </template>
  98. </el-col>
  99. </el-row>
  100. </el-form>
  101. <el-row class="flex mt15">
  102. <div class="flex-margin">
  103. <el-button size="default" @click="onResetForm(formRulesOneRef)">
  104. <el-icon>
  105. <ele-RefreshRight/>
  106. </el-icon>
  107. 重置
  108. </el-button>
  109. <el-button size="default" type="success" @click="onQueryChange">
  110. <SvgIcon name="ele-Search"/>
  111. 查询
  112. </el-button>
  113. <slot name="extra"></slot>
  114. </div>
  115. </el-row>
  116. </el-card>
  117. </div>
  118. </template>
  119. <script setup lang="ts" name="ExtForm">
  120. import {reactive, ref, computed,onMounted} from 'vue';
  121. import {ElMessage} from 'element-plus';
  122. import type {FormInstance} from 'element-plus';
  123. import fieldUtil from "/@/utils/field";
  124. const emit = defineEmits(['change', 'update:value']);
  125. const props = defineProps({
  126. columns: {
  127. type: Array<IField>
  128. },
  129. value: {
  130. type: Object,
  131. require: true
  132. },
  133. importConfig: {
  134. type: Object,
  135. }
  136. })
  137. const form = computed(() => {
  138. return {...props.value}
  139. })
  140. const rules = computed(() => {
  141. return [];
  142. })
  143. // 定义变量内容
  144. const formRulesOneRef = ref<FormInstance>();
  145. const state = reactive({
  146. cols: [],
  147. form: {
  148. name: '',
  149. email: '',
  150. autograph: '',
  151. occupation: '',
  152. list: [
  153. {
  154. year: '',
  155. month: '',
  156. day: '',
  157. },
  158. ],
  159. remarks: '',
  160. },
  161. });
  162. onMounted(()=>{
  163. console.log(props.columns)
  164. state.cols = fieldUtil.toFormQueryField(props.columns);
  165. console.log(state.cols)
  166. })
  167. const onQueryChange = () => {
  168. emit("update:value", form);
  169. emit("change")
  170. }
  171. // 重置表单
  172. const onResetForm = (formEl: FormInstance | undefined) => {
  173. if (!formEl) return;
  174. formEl.resetFields();
  175. emit("update:value", {})
  176. emit("change")
  177. };
  178. </script>