移动端Vant-list的二次封装,查询参数重置

[复制链接]
发表于 2026-2-27 07:22:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Vant-list的二次封装

场景:在写项目需求的时间,移动端有用到vant-list组件。后续需求更新说要对列表数据页加搜刮和筛选的功能。发现每次筛选完得在页面内手动重置一次查询参数。不方便,以是封了一层。
二次封装代码
  1. <template>
  2.   <van-list
  3.     v-model:loading="loading"
  4.     :finished="finished"
  5.     @load="handleLoad"
  6.   >
  7.     <div :class="listClass">
  8.       <slot
  9.         v-for="item in listData"
  10.         :key="item.id"
  11.         v-bind="item"
  12.       />
  13.     </div>
  14.     <div v-if="loadOnce && !listData?.length" class="layout-list__empty">暂无数据</div>
  15.   </van-list>
  16. </template>
  17. <script setup>
  18. const props = defineProps({
  19.   request: {},
  20.   listClass: {},
  21.   pageSize: {
  22.     type: Number,
  23.     default: 10,
  24.   },
  25. });
  26. const listData = ref([]);
  27. const loading = ref(false);
  28. const finished = ref(false);
  29. const loadOnce = ref(false);
  30. let pageNum = 0;
  31. let requesting = false;
  32. const handleLoad = async () => {
  33.   if (requesting || unref(finished)) { return }
  34.   requesting = true;
  35.   ++pageNum;
  36.   const formContent = {
  37.     page: pageNum,
  38.     pageSize: props.pageSize,
  39.   };
  40.   const { total, data } = await props.request(formContent);
  41.   unref(listData).push(...data);
  42.   loadOnce.value = true;
  43.   if (!unref(listData).length || unref(listData).length >= total) {
  44.     finished.value = true;
  45.   }
  46.   loading.value = false;
  47.   requesting = false;
  48. };
  49. const resetSearch = () => {
  50.   listData.value = [];
  51.   loading.value = false;
  52.   finished.value = false;
  53.   loadOnce.value = false;
  54.   pageNum = 0;
  55.   requesting = false;
  56.   handleLoad();
  57. };
  58. defineExpose({
  59.   resetSearch,
  60. });
  61. </script>
  62. <style lang="scss" scoped>
  63. .layout-list {
  64.   &__empty {
  65.     padding: 12px 0;
  66.     color: #666;
  67.     text-align: center;
  68.   }
  69. }
  70. </style>
复制代码
组件利用
  1. <mb-search
  2.         @updated-search="updatedSearch"
  3. />
  4. <mb-list
  5.         ref="mbListRef"
  6.         v-slot="item"
  7.         :request="getList(() => (loadForm))"
  8. >
  9.         <div>内容</div>
  10. </mb-list>
  11. <script setup>
  12. import { getList } from '@/services/activiti/instance';
  13. defineProps({
  14.   selectTypeList: {
  15.     type: Array,
  16.     default: () => [],
  17.   },
  18. });
  19. const mbListRef = ref();
  20. const loadForm = ref({
  21.   title: '',
  22.   defName: '',
  23.   instStatus: 'running',
  24. });
  25. function updatedSearch(title) {
  26.   loadForm.value.title = title;
  27.   mbListRef.value.resetSearch();
  28. }
  29. </script>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表