index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <el-form label-position="right" label-width="auto" class="layout-container-form"
  3. :model="form" @submit.prevent>
  4. <el-row :gutter="24">
  5. <el-col v-for="item in formItems" :key="item.prop" :span="item.colSpan || 8" :xs="24" :sm="12" :md="12" :lg="8"
  6. :xl="6">
  7. <el-form-item :label="item.label" :label-width="item.labelWidth" class="form-item">
  8. <el-input v-if="item.type === 'append'" v-model.number="form[item.prop]" :placeholder="item.placeholder"
  9. clearable @clear="form[item.prop] = ''" class="fixed-width-input">
  10. <template #append>岁</template>
  11. </el-input>
  12. <el-input v-if="item.type === 'input'" v-model.trim="form[item.prop]"
  13. :placeholder="form[item.placeholder] || '请输入'" :clearable="true" @keyup.enter="handleEnter(item)"
  14. @clear="form[item.prop] = ''" class="fixed-width-input"></el-input>
  15. <el-select v-else-if="item.type === 'select'" v-model="form[item.prop]" :placeholder="item.placeholder || '请选择'"
  16. filterable :clearable="item.clearable === false ? false : true" @clear="form[item.prop] = ''"
  17. class="fixed-width-select" @change="handleSelect(form[item.prop], item)">
  18. <el-option v-for="option in item.options" :key="option.value" :label="option.label"
  19. :value="option.value"></el-option>
  20. </el-select>
  21. <el-select v-else-if="item.type === 'selectGroup'" v-model="form[item.prop]" :clearable="true" filterable
  22. class="fixed-width-select">
  23. <el-option-group v-for="group in item.options" :key="group.id" :label="group.shelfName">
  24. <el-option v-for="s in group.children" :key="s.id" :label="s.shelfName" :value="s.shelfName" />
  25. </el-option-group>
  26. </el-select>
  27. <div v-else-if="item.type === 'date'">
  28. <el-date-picker v-model="form[item.prop]" :type="item.dateType" :placeholder="item.placeholder"
  29. :clearable="true" class="fixed-width-picker" style="width: 250px;"></el-date-picker>
  30. </div>
  31. <div v-else-if="item.type === 'daterange'">
  32. <el-date-picker v-model="form[item.prop]" type="daterange" range-separator="至" start-placeholder="开始日期"
  33. end-placeholder="结束日期" size="default" :clearable="true" style="width: 230px;" />
  34. </div>
  35. <div v-else-if="item.type === 'date'">
  36. <el-date-picker v-model="form[item.prop]" type="date" :placeholder="item.placeholder || '请选择'" :size="default" />
  37. </div>
  38. <el-text v-if="item.type === 'text'">{{ item.label }}</el-text>
  39. <div v-if="item.type === 'table'">
  40. <slot></slot>
  41. </div>
  42. </el-form-item>
  43. </el-col>
  44. <el-col v-if="is_button" :span="6" class="is_button" :xs="24" :sm="12" :md="12" :lg="8" :xl="6">
  45. <div v-if="formItems.length < 3" style="margin-left: 200px;"></div>
  46. <div v-else style="width:15px"></div>
  47. <el-button type="primary" :style="{ marginLeft: !is_reset ? '100px' : '' }" @click="submitForm">搜索</el-button>
  48. <el-button class="default-but" @click="resetForm" v-if="is_reset">重置</el-button>
  49. <el-button v-if="is_add_button" type="primary" @click="addForm">+ {{ is_add_button }}</el-button>
  50. </el-col>
  51. </el-row>
  52. </el-form>
  53. </template>
  54. <script>
  55. import { reactive, onBeforeMount,watchEffect } from "vue";
  56. export default {
  57. props: {
  58. formItems: {
  59. type: Array,
  60. required: true,
  61. },
  62. // 是否显示按钮
  63. is_button: {
  64. type: Boolean,
  65. default: true,
  66. },
  67. // 重置按钮
  68. is_reset: {
  69. type: Boolean,
  70. default: true,
  71. },
  72. // 自定义按钮
  73. is_add_button: {
  74. type: String,
  75. default: '',
  76. }
  77. },
  78. setup(props, { emit }) {
  79. const form = reactive({
  80. // 表单项的初始值
  81. });
  82. function initFormDefaults() {
  83. props.formItems.forEach(item => {
  84. // console.log('item', item)
  85. if (item.defaultVal) {
  86. Object.assign(form, {
  87. [item.prop]: item.defaultVal
  88. })
  89. }
  90. })
  91. }
  92. function submitForm() {
  93. // 执行搜索逻辑
  94. // 可以通过 form 获取表单数据进行搜索操作
  95. // console.log("搜索表单提交", form);
  96. // 触发自定义事件,并将数据作为参数传递给父组件
  97. emit("formSubmitted", form);
  98. }
  99. function handleEnter(item) {
  100. // 当用户按下回车键时,执行搜索逻辑
  101. if (item.type === "input" && item.needEnterEvent) {
  102. submitForm();
  103. }
  104. }
  105. function resetForm() {
  106. // 重置表单
  107. for (const item of props.formItems) {
  108. form[item.prop] = null;
  109. }
  110. emit("formReset");
  111. // 重置其他表单项的值
  112. }
  113. function addForm() {
  114. emit('addForm')
  115. }
  116. function handleSelect(e,item) {
  117. // console.log('e :===>>', e);
  118. // console.log('e :===>>', item);
  119. emit('formChangeSelect',item,e)
  120. }
  121. onBeforeMount(() => {
  122. initFormDefaults()
  123. })
  124. watchEffect(() => {
  125. initFormDefaults()
  126. })
  127. return {
  128. form,
  129. submitForm,
  130. resetForm,
  131. handleEnter,
  132. addForm,
  133. handleSelect,
  134. };
  135. },
  136. };
  137. </script>
  138. <style scoped>
  139. .fixed-width-input,
  140. .fixed-width-select,
  141. .fixed-width-picker {
  142. min-width: 250px;
  143. max-width: 250px;
  144. }
  145. :deep() {
  146. .fixed-width-input .el-input__wrapper,
  147. .fixed-width-select .el-input__wrapper,
  148. .fixed-width-picker .el-input__wrapper {
  149. background-color: var(--system-page-background);
  150. color: var(--system-page-color);
  151. border-color: var(--system-page-border-color);
  152. }
  153. .el-input__wrapper,
  154. .default-but {
  155. background-color: var(--system-page-background);
  156. color: var(--system-page-color);
  157. border-color: var(--system-page-border-color);
  158. }
  159. }
  160. .is_button {
  161. display: flex;
  162. text-align: center;
  163. margin-top: 15px;
  164. }
  165. ::v-deep(.custom-date-picker .el-input__inner) {
  166. width: 250px !important;
  167. /* 你想要设置的宽度 */
  168. border-bottom-color: red !important;
  169. }
  170. </style>