searchBox.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <div id="searchBox">
  3. <div class="inputListBox">
  4. <el-form :inline="true" :model="formData" class="demo-form-inline">
  5. <el-form-item
  6. v-for="(item, index) in formList"
  7. :key="index"
  8. :label="item.label"
  9. >
  10. <el-select
  11. v-if="item.scope === 'select'"
  12. v-model="formData[item.prop]"
  13. :placeholder="item.placeholder"
  14. :size="size"
  15. >
  16. <el-option
  17. v-for="(items, indexs) in item.options"
  18. :key="indexs"
  19. :label="items.label"
  20. :value="items.value"
  21. ></el-option>
  22. </el-select>
  23. <div v-else-if="item.scope === 'numList'">
  24. <el-input-number
  25. :controls="false"
  26. v-model="formData[item.prop1]"
  27. controls-position="right"
  28. :min="0"
  29. :max="100"
  30. size="small"
  31. @change="handleChanges(formData[item.prop1],formData[item.prop2])"
  32. ></el-input-number>~
  33. <el-input-number
  34. :controls="false"
  35. v-model="formData[item.prop2]"
  36. controls-position="right"
  37. :min="0"
  38. :max="100"
  39. size="small"
  40. @change="handleChanges(formData[item.prop1],formData[item.prop2])"
  41. ></el-input-number>
  42. </div>
  43. <el-input-number
  44. v-else-if="item.scope === 'inputNumber'"
  45. v-model="formData[item.prop]"
  46. controls-position="right"
  47. :min="0"
  48. :max="100"
  49. size="small"
  50. ></el-input-number>
  51. <el-cascader
  52. v-else-if="item.scope === 'cascader'"
  53. v-model="formData[item.prop]"
  54. :options="item.options"
  55. :size="size"
  56. :props="{
  57. label: item.props.label,
  58. value: item.props.value,
  59. checkStrictly: true,
  60. emitPath: false,
  61. }"
  62. ></el-cascader>
  63. <el-date-picker
  64. v-else-if="item.scope === 'datePicker'"
  65. v-model="formData[item.prop]"
  66. type="datetimerange"
  67. :picker-options="pickerOptions"
  68. range-separator="至"
  69. start-placeholder="开始日期"
  70. end-placeholder="结束日期"
  71. align="right"
  72. :size="size"
  73. value-format="timestamp"
  74. >
  75. </el-date-picker>
  76. <el-date-picker
  77. v-else-if="item.scope === 'datePickerA'"
  78. v-model="formData[item.prop]"
  79. type="datetime"
  80. :size="size"
  81. placeholder="选择日期时间"
  82. value-format="timestamp"
  83. >
  84. </el-date-picker>
  85. <el-input
  86. v-else
  87. v-model="formData[item.prop]"
  88. :placeholder="item.placeholder"
  89. :size="size"
  90. ></el-input>
  91. </el-form-item>
  92. </el-form>
  93. </div>
  94. <el-form :inline="true" class="btnListBox">
  95. <el-form-item>
  96. <el-button :size="size" type="primary" @click="search">查询</el-button>
  97. <el-button :size="size" @click="init">重置</el-button>
  98. </el-form-item></el-form
  99. >
  100. </div>
  101. </template>
  102. <script>
  103. export default {
  104. props: ["formList"], //参考文档 component.md
  105. data() {
  106. return {
  107. size: "medium", //输入框尺寸类型
  108. formData: {}, //表单数据收集
  109. pickerOptions: {
  110. //日期选择器近期功能
  111. shortcuts: [
  112. {
  113. text: "最近一周",
  114. onClick(picker) {
  115. const end = new Date();
  116. const start = new Date();
  117. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  118. picker.$emit("pick", [start, end]);
  119. },
  120. },
  121. {
  122. text: "最近一个月",
  123. onClick(picker) {
  124. const end = new Date();
  125. const start = new Date();
  126. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  127. picker.$emit("pick", [start, end]);
  128. },
  129. },
  130. {
  131. text: "最近三个月",
  132. onClick(picker) {
  133. const end = new Date();
  134. const start = new Date();
  135. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  136. picker.$emit("pick", [start, end]);
  137. },
  138. },
  139. ],
  140. },
  141. };
  142. },
  143. created(){
  144. var self = this
  145. document.onkeydown = function (e) {
  146. var key = window.event.keyCode;
  147. if (key === 13) {
  148. self.search();
  149. }
  150. };
  151. },
  152. methods: {
  153. //搜索
  154. search() {
  155. this.$emit("search", this.formData);
  156. },
  157. //重置
  158. init() {
  159. this.formData = {};
  160. this.$emit("init");
  161. },
  162. handleChanges(int1,int2){
  163. if(int1 !== undefined && int2 !== undefined){
  164. if(int1 > int2){
  165. this.$message.error('请规范输入取值范围')
  166. }
  167. }
  168. },
  169. },
  170. };
  171. </script>
  172. <style lang="less" scoped>
  173. #searchBox {
  174. display: flex;
  175. .inputListBox {
  176. flex: 1;
  177. }
  178. }
  179. </style>