FormSearchGroup.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <!-- 需要配合 page_search search_content content_left 一起使用 -->
  2. <template>
  3. <div class="simple_filter">
  4. <template v-for="item in props.searchList" :key="item.key">
  5. <el-select
  6. v-if="item.type == 'select'"
  7. v-model="searchData[item.key]"
  8. @change="(val)=>HandleSearchItemChange(item.key)"
  9. :placeholder="item.placeholder"
  10. :disabled="formDisabled || item.disabled"
  11. >
  12. <el-option
  13. v-for="optItm in item.options"
  14. :key="optItm.value" :value="optItm.value"
  15. :label="optItm.label"
  16. :disabled="optItm.disabled ? true : false">
  17. </el-option>
  18. </el-select>
  19. <!-- :size="size" -->
  20. <el-date-picker
  21. @change="(val)=>HandleSearchItemChange(item.key)"
  22. v-else-if="item.type == 'datePicker'"
  23. v-model="searchData[item.key]"
  24. :disabeld="formDisabled || item.disabled"
  25. type="daterange"
  26. range-separator="-"
  27. start-placeholder="开始时间"
  28. end-placeholder="结束时间"
  29. />
  30. <!-- 这个输入框的搜索要动态查询 ———— -->
  31. <el-input
  32. v-else-if="item.type == 'input'"
  33. v-model="searchData[item.key]"
  34. @input="(val,e)=>HandleInputChange(val,e,item.key)"
  35. @keyup.enter="(event)=>HandleSearchItemChange(item.key)"
  36. :placeholder="item.placeholder"
  37. :disabled="formDisabled || item.disabled"
  38. >
  39. <template #append>
  40. <el-button @click="HandleSearchItemChange(item.key)" :icon="Search" />
  41. </template>
  42. </el-input>
  43. <el-radio-group
  44. v-else-if="item.type == 'radio'"
  45. v-model="searchData[item.key]"
  46. @change="()=>HandleSearchItemChange(item.key)"
  47. :disabled="formDisabled || item.disabled"
  48. >
  49. <el-radio v-for="radioItem in item.options" :key="radioItem.value" :value="radioItem.value">{{ radioItem.label }}</el-radio>
  50. </el-radio-group>
  51. </template>
  52. </div>
  53. </template>
  54. <script setup lang="ts">
  55. import { Search } from '@element-plus/icons-vue'
  56. import { ref, watch } from 'vue'
  57. interface SearchItem {
  58. key:String,
  59. type:'input'|'select'|'datePicker'|'radio',
  60. placeholder?:String,
  61. defaultValue?:any,
  62. disabled?:Boolean
  63. options?:{
  64. label:String,
  65. value:String,
  66. disabled?:Boolean
  67. }[]
  68. }
  69. const props = defineProps({
  70. searchList:{
  71. type:Array<SearchItem>,
  72. required:true
  73. },
  74. formDisabled:{
  75. type:Boolean,
  76. required:false
  77. }
  78. })
  79. const emit = defineEmits(['searchChange'])
  80. const searchData = ref({})
  81. // 筛选条件变更触发新的查询
  82. const HandleSearchItemChange = async (key)=>{
  83. // 触发父级页面的查询
  84. emit('searchChange',searchData.value,key)
  85. }
  86. const inputFlag = ref()
  87. const HandleInputChange = (val,e,key)=>{
  88. if(inputFlag.value){
  89. // 还在定时器内,延迟触发
  90. clearTimeout(inputFlag.value)
  91. inputFlag.value = ''
  92. }
  93. // 要防抖
  94. inputFlag.value = setTimeout(()=>{
  95. console.log('input__输入的值',val)
  96. // 触发父级页面的查询
  97. emit('searchChange',searchData.value,key)
  98. },400)
  99. }
  100. //
  101. watch(()=>props.searchList, (newVal)=>{
  102. searchData.value = {}
  103. // console.log('查询项变更了===表单',newVal)
  104. newVal.forEach(item=>{
  105. if(item.defaultValue){
  106. searchData.value[item.key] = item.defaultValue
  107. }
  108. })
  109. // emit('searchChange',searchData.value)
  110. },{immediate:true,deep:true})
  111. </script>
  112. <style lang="scss" scoped>
  113. .simple_filter {
  114. display: flex;
  115. flex-wrap: wrap;
  116. gap: 10px;
  117. :deep(.el-date-editor){
  118. max-width: 240px;
  119. }
  120. :deep(.el-input){
  121. width: 260px;
  122. }
  123. :deep(.el-radio-group){
  124. .el-radio{
  125. margin-right: 20px;
  126. }
  127. }
  128. }
  129. .page_search .search_content .content_right{
  130. .el-button {
  131. margin-left: -20px !important;
  132. min-width: auto !important;
  133. }
  134. }
  135. </style>