companySelectionLike.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <ion-button 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 :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.firmName"
  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.firmName)"></span>
  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, watch} from 'vue';
  52. import {arrowBackOutline, searchOutline} from 'ionicons/icons';
  53. import {IonIcon, onIonViewDidEnter} from '@ionic/vue';
  54. import BEmpty from "@/components/empty.vue";
  55. import {getFirmNameLikeList} from "@/api/company";
  56. export default defineComponent({
  57. name: 'companySelectLike',
  58. components: {IonIcon, BEmpty},
  59. props: {},
  60. setup(props, context) {
  61. const total = ref(30);
  62. const loading = ref(false);
  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. firmName: '',
  72. });
  73. const isOpen = ref(false);
  74. const dataList = ref<any>([]);
  75. const resultInfo = reactive({value: '', text: ''})
  76. const reloadBool = ref(true);
  77. const reload = () => {
  78. if(searchParams.firmName==''){
  79. dataList.value = [];
  80. return;
  81. }
  82. setTimeout(()=>{
  83. searchParams.pageIndex = 1;
  84. if (reloadBool.value == false) {
  85. return;
  86. }
  87. reloadBool.value = false;
  88. loading.value = true;
  89. getFirmNameLikeList(searchParams).then(data => {
  90. dataList.value = data.list;
  91. total.value = data.total;
  92. reloadBool.value = true;
  93. loading.value = false;
  94. })
  95. },1000)
  96. }
  97. // const loadData = async function () {
  98. // loading.value = true;
  99. // getFirmNameLikeList(searchParams).then(data => {
  100. // dataList.value = dataList.value.concat(data.list);
  101. // total.value = data.total;
  102. // loading.value = false;
  103. // })
  104. // }
  105. // const onScroll = (e: any) => {
  106. // setTimeout(() => {
  107. // e.target.complete();
  108. // if (pagination.value.total.value > pagination.value.current * pagination.value.pageSize) {
  109. // searchParams.pageIndex += 1;
  110. // loadData();
  111. // }
  112. // }, 500);
  113. // }
  114. const onConfirm = () => {
  115. if (searchParams.firmName) {
  116. resultInfo.text = searchParams.firmName;
  117. context.emit("resultInfo", resultInfo);
  118. }
  119. onOpen();
  120. }
  121. const onSelect = (item: any) => {
  122. resultInfo.text = item.firmName;
  123. resultInfo.value = item.professionID;
  124. context.emit("resultInfo", resultInfo);
  125. onOpen();
  126. }
  127. const onOpen = () => {
  128. isOpen.value = !isOpen.value;
  129. }
  130. const onRest = () => {
  131. dataList.value = [];
  132. searchParams.firmName = '';
  133. searchParams.pageIndex = 1;
  134. resultInfo.text = '';
  135. resultInfo.value = '';
  136. }
  137. const formatStr = (str: any) => {
  138. if (!str) {
  139. return "";
  140. }
  141. return str.replace(searchParams.firmName, '<span style="color: coral">' + searchParams.firmName + '</span>');
  142. }
  143. return {
  144. searchOutline,
  145. arrowBackOutline,
  146. total,
  147. loading,
  148. isOpen,
  149. dataList,
  150. pagination,
  151. searchParams,
  152. onConfirm,
  153. onSelect,
  154. onOpen,
  155. reload,
  156. onRest,
  157. formatStr
  158. }
  159. }
  160. });
  161. </script>