college-list.vue 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <template>
  2. <z-paging ref="paging" v-model="list" auto-show-system-loading :auto="false" @query="handleQuery"
  3. @on-refresh="handleRefresh">
  4. <template #top>
  5. <slot name="top"/>
  6. <mx-condition-dropdown/>
  7. </template>
  8. <slot name="prefix"/>
  9. <view class="p-20">
  10. <mx-search v-model="queryParams.name" placeholder="请输入院校名称" @search="handleSearch"
  11. @clear="handleSearch"/>
  12. </view>
  13. <view class="px-20 fx-col gap-20">
  14. <college-item v-for="i in list" :item="i" class="mx-card" @click="handleDetail(i)"/>
  15. </view>
  16. </z-paging>
  17. </template>
  18. <script setup>
  19. import {ref, computed, onMounted} from 'vue';
  20. import {filters, universityList, universityDetail} from "@/api/webApi/collegemajor";
  21. import {useCacheStore} from "@/hooks/useCacheStore";
  22. import {useTransfer} from "@/hooks/useTransfer";
  23. import {useProvideSearchModel} from "@/components/mx-condition/useSearchModelInjection";
  24. import {useConditionCollegeFeatures} from "@/components/mx-condition/modules/useConditionCollegeFeatures";
  25. import {useConditionCollegeType} from "@/components/mx-condition/modules/useConditionCollegeType";
  26. import {useConditionCollegeNatureTypeCN} from "@/components/mx-condition/modules/useConditionCollegeNatureTypeCN";
  27. import {useConditionCollegeLocation} from "@/components/mx-condition/modules/useConditionCollegeLocation";
  28. import CollegeItem from "@/pages/college-library/components/college-item.vue";
  29. import {sleep} from "@/uni_modules/uv-ui-tools/libs/function";
  30. import {createPropDefine} from "@/utils";
  31. const props = defineProps({
  32. customItemClick: createPropDefine(false, Boolean),
  33. extraFilter: createPropDefine({}, Object)
  34. })
  35. const emits = defineEmits(['item-click'])
  36. const {dispatchCache, removeCache} = useCacheStore()
  37. const {transferTo} = useTransfer()
  38. const paging = ref(null)
  39. const list = ref([])
  40. const filter = ref({})
  41. const queryParams = ref({
  42. name: '',
  43. features: [],
  44. type: [],
  45. natureTypeCN: [],
  46. location: [],
  47. level: []
  48. })
  49. const {onSearch} = useProvideSearchModel([
  50. useConditionCollegeFeatures(computed(() => filter.value['features'])),
  51. useConditionCollegeType(computed(() => filter.value['types'])),
  52. useConditionCollegeNatureTypeCN(computed(() => filter.value['natureTypes'])),
  53. useConditionCollegeLocation(computed(() => filter.value['locations']))
  54. // IE中其实没有level属性
  55. ], queryParams)
  56. onSearch(async () => {
  57. await sleep(300) // 等动画结束再查
  58. handleSearch()
  59. })
  60. const handleSearch = () => {
  61. paging.value.reload()
  62. }
  63. const handleRefresh = () => {
  64. removeCache(universityList)
  65. removeCache(universityDetail)
  66. }
  67. const handleQuery = (pageNum, pageSize) => {
  68. const query = {pageNum, pageSize, ...props.extraFilter, ...queryParams.value}
  69. dispatchCache(universityList, query)
  70. .then(res => paging.value.completeByTotal(res.rows, res.total))
  71. .catch(e => paging.value.complete(false))
  72. }
  73. const handleDetail = (college) => {
  74. if (props.customItemClick) return emits('item-click', college)
  75. const {code} = college
  76. transferTo('/pages/college-library/detail/detail', {code})
  77. }
  78. onMounted(async () => {
  79. const res = await dispatchCache(filters)
  80. filter.value = {...res.data} // 创建副本,防止不能正确触发searchModelService
  81. })
  82. </script>
  83. <style scoped lang="scss">
  84. </style>