index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <div class="fieldPanel">
  3. <a-card :bodyStyle="{padding:'20px 10px 0 10px'}">
  4. <!-- <template #title>筛选</template> -->
  5. <a-form
  6. ref="formRef"
  7. name="advanced_search"
  8. class="ant-advanced-search-form"
  9. :label-col="{ span: 6 }"
  10. :wrapper-col="{ span: 18 }"
  11. :model="formState"
  12. @finish="onFinish">
  13. <a-row :gutter="16">
  14. <a-col v-for="(i) in searchType" :key="i" :md="{ span: 24, offset: 0 }" :lg="{ span: 6, offset: 0 }" :xxl="{span: 6, offset: 0 }">
  15. <a-form-item
  16. :name="i.key"
  17. :label="i.label"
  18. :rules="[{ required: false, message: `${i.label}不能为空`}]"
  19. layout="vertical"
  20. >
  21. <a-input v-if="i.type=='input'" v-model:value="formState[i.key]" :placeholder="i.label"></a-input>
  22. <a-select v-if="i.type=='select'" v-model:value="formState[i.key]" :placeholder="i.label" :getPopupContainer="triggerNode => {return triggerNode.parentNode || document.body;}">
  23. <a-select-option v-for="item in i.dataSource" :key="item.index" :value="item.value">{{item.remarks}}</a-select-option>
  24. </a-select>
  25. <a-date-picker style="width:100%" v-if="i.type == 'datepicker'" v-model:value="formState[i.key]" value-format="YYYY-MM-DD" :placeholder="i.label"/>
  26. <a-range-picker style="width:100%" v-if="i.type == 'datepickerRange'" v-model:value="formState[i.key]" value-format="YYYY-MM-DD" @change="dateRangeChange(formState[i.key],i)"/>
  27. </a-form-item>
  28. </a-col>
  29. <a-col :md="{ span: 24, offset: 0 }" :lg="{ span: 6, offset: 0 }" :xxl="{span: 6, offset: 0 }">
  30. <a-space>
  31. <a-button type="primary" html-type="submit">查询</a-button>
  32. <a-button @click="() => formRef.resetFields()">重置</a-button>
  33. </a-space>
  34. </a-col>
  35. </a-row>
  36. </a-form>
  37. </a-card>
  38. </div>
  39. </template>
  40. <script setup>
  41. import { defineComponent, reactive, ref,defineEmits,onMounted,watch} from 'vue';
  42. import { DownOutlined, UpOutlined } from '@ant-design/icons-vue';
  43. import { useRouter,onBeforeRouteLeave } from "vue-router";
  44. const router = useRouter()
  45. const props = defineProps({
  46. searchType:Array
  47. })
  48. const expand = ref(false);
  49. const formRef = ref();
  50. let formState = ref({});
  51. const emit = defineEmits(['onSubmit'])
  52. const onFinish = (values) => {
  53. localStorage.setItem('formState',JSON.stringify(formState.value))
  54. emit('onSubmit',formState.value)
  55. }
  56. const dateRangeChange = (dates,i)=>{
  57. i.objKeys.forEach((o,i) => {
  58. formState.value[o] = dates[i]
  59. });
  60. }
  61. onMounted(()=>{
  62. props.searchType.forEach(e=>{
  63. formState.value[e.key] = e.defaultData
  64. })
  65. })
  66. watch(() => router.currentRoute.value,(to, from) => {
  67. if (from.meta.name !== to.meta.name) {
  68. localStorage.removeItem('formState')
  69. }
  70. })
  71. </script>
  72. <style>
  73. .fieldPanel{
  74. /* border-bottom:10px solid #f1f2f3 */
  75. margin-bottom: 10px;
  76. }
  77. #components-form-demo-advanced-search .ant-form {
  78. max-width: none;
  79. }
  80. #components-form-demo-advanced-search .search-result-list {
  81. margin-top: 16px;
  82. border: 1px dashed #e9e9e9;
  83. border-radius: 2px;
  84. background-color: #fafafa;
  85. min-height: 200px;
  86. text-align: center;
  87. padding-top: 80px;
  88. }
  89. [data-theme='dark'] .ant-advanced-search-form {
  90. background: rgba(255, 255, 255, 0.04);
  91. border: 1px solid #434343;
  92. padding: 24px;
  93. border-radius: 2px;
  94. }
  95. [data-theme='dark'] #components-form-demo-advanced-search .search-result-list {
  96. border: 1px dashed #434343;
  97. background: rgba(255, 255, 255, 0.04);
  98. }
  99. </style>