postSelectionLike.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <template>
  2. <ion-button id="postSelectionLike" style="color: #02a6f1;font-size: 15px;" fill="clear" @click="onOpen">选择
  3. </ion-button>
  4. <ion-page>
  5. <ion-content class="ion-padding">
  6. <ion-modal trigger="postSelectionLike" :is-open="isOpen" @willPresent="onRest">
  7. <ion-header class="header-theme2">
  8. <ion-toolbar>
  9. <ion-buttons slot="start">
  10. <ion-icon :icon="arrowBackOutline" @click="onOpen"></ion-icon>
  11. </ion-buttons>
  12. <ion-title>岗位名称</ion-title>
  13. <ion-buttons slot="end">
  14. <ion-button fill="clear" @click="onConfirm">确定</ion-button>
  15. </ion-buttons>
  16. </ion-toolbar>
  17. </ion-header>
  18. <ion-content class="ion-padding">
  19. <ion-item class="search-item" style="--border-style: unset; --inner-padding-end: 0px;--padding-start: 0px;">
  20. <ion-input placeholder="岗位名称" class="custom"
  21. v-model="searchParams.professionName"
  22. @input="reload" :clear-on-edit="true"
  23. style="border: 1px solid #f2f2f5;border-radius: 14px;--padding-start: 10px;height: 35px;">
  24. <ion-icon slot="start" :icon="searchOutline" aria-hidden="true"></ion-icon>
  25. </ion-input>
  26. </ion-item>
  27. <div class="bw-vue-list">
  28. <div class="list-content">
  29. <ion-list>
  30. <ion-item v-for="(record,key) in dataList" :key="key">
  31. <ion-label @click="onSelect(record)" >
  32. <span v-html="formatStr(record.professionName)"></span>({{record.parentProfessionName}})
  33. </ion-label>
  34. </ion-item>
  35. </ion-list>
  36. <b-empty v-if="dataList.length<=0" :loading="loading"/>
  37. <ion-infinite-scroll threshold="100px" @ionInfinite="onScroll($event)">
  38. <ion-infinite-scroll-content
  39. :loadingText="pagination.total>pagination.current*pagination.pageSize?'正在加载...':'暂无更多'"
  40. loadingSpinner="bubbles">
  41. </ion-infinite-scroll-content>
  42. </ion-infinite-scroll>
  43. </div>
  44. </div>
  45. </ion-content>
  46. </ion-modal>
  47. </ion-content>
  48. </ion-page>
  49. </template>
  50. <script lang="ts">
  51. import {computed, defineComponent, reactive, ref} from 'vue';
  52. import {arrowBackOutline, searchOutline} from 'ionicons/icons';
  53. import {IonIcon} from '@ionic/vue';
  54. import BEmpty from "@/components/empty.vue";
  55. import {getProfessionLikeList} from "@/api/recommendmgt";
  56. export default defineComponent({
  57. name: 'postSelectLike',
  58. components: {IonIcon, BEmpty},
  59. props: {},
  60. setup(props, context) {
  61. const total = ref(20);
  62. const loading = ref(true);
  63. const pagination = computed(() => ({
  64. total: total,
  65. current: searchParams.pageIndex,
  66. pageSize: searchParams.pageSize
  67. }));
  68. const searchParams = reactive({
  69. pageIndex: 1,
  70. pageSize: 10,
  71. professionName: '',
  72. });
  73. const isOpen = ref(false);
  74. const dataList = ref<any>([]);
  75. const resultInfo = reactive({value: '', text: ''})
  76. const loadData = async function () {
  77. loading.value = true;
  78. getProfessionLikeList(searchParams).then(data => {
  79. dataList.value = dataList.value.concat(data.list);
  80. total.value = data.total;
  81. })
  82. loading.value = false;
  83. }
  84. const reload = () => {
  85. dataList.value = [];
  86. searchParams.pageIndex = 1;
  87. loadData();
  88. }
  89. const onScroll = (e: any) => {
  90. setTimeout(() => {
  91. e.target.complete();
  92. if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
  93. searchParams.pageIndex += 1;
  94. loadData();
  95. }
  96. }, 500);
  97. }
  98. const onConfirm = () => {
  99. resultInfo.text = searchParams.professionName;
  100. context.emit("resultInfo", resultInfo);
  101. onOpen();
  102. }
  103. const onSelect = (item: any) => {
  104. resultInfo.text = item.professionName;
  105. resultInfo.value = item.professionID;
  106. context.emit("resultInfo", resultInfo);
  107. onOpen();
  108. }
  109. const onOpen = () => {
  110. isOpen.value = !isOpen.value;
  111. }
  112. const onRest = () => {
  113. dataList.value = [];
  114. searchParams.professionName = '';
  115. searchParams.pageIndex = 1;
  116. resultInfo.text = '';
  117. resultInfo.value = '';
  118. }
  119. const formatStr = (str: any) => {
  120. if(!str){
  121. return "";
  122. }
  123. return str.replace(searchParams.professionName,'<span style="color: coral">'+searchParams.professionName+'</span>');
  124. }
  125. return {
  126. searchOutline,
  127. arrowBackOutline,
  128. total,
  129. loading,
  130. isOpen,
  131. dataList,
  132. pagination,
  133. searchParams,
  134. onConfirm,
  135. onSelect,
  136. onOpen,
  137. onScroll,
  138. loadData,
  139. reload,
  140. onRest,
  141. formatStr
  142. }
  143. }
  144. });
  145. </script>