2022年10月15日

vue3+vant3实现懒加载与分页效果。

作者 admin

前段时间用vue3.3+vant3做了一个移动端的 小程序项目 ,里面涉及到了 懒加载与分页功能,今天总结一下 。

先看下vant官方的文档:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/list

官网给到了相关的代码 是list列表我这边的实际效果是这样—>

vant-list 套 van-cell,既 列表懒加载 内部是单元格组件,废话不多说 直接看代码 :

index.vue

<van-list v-model="loading" :finished="finished" finished-text="暂时没有更多了~" @load="listOnLoad"
  class="finished-text" v-model:error="error" error-text="加载失败,请重试!">
     <UploadItem v-for="(item,index) in fileItemArr" :key="item.file_id" :listData="item" :listIndex='index' />
    
</van-list>

export default {
  components: {
    UploadItem: defineAsyncComponent(() =>
      import("./uploadItem.vue")
    ),
  },

data() {
    return {
      loading: false,
      finished: false,
      error: false,
      fileItemArr: [],
      patiendValue: '',
      pageNum: 1, //当前页
      per_page: 30, //当前页显示多少条
    }
  },

methods: {
async listOnLoad() {
      if (this.latestLoadTime) clearTimeout(this.latestLoadTime) //每次进来先清理上一次的计时
      this.latestLoadTime = setTimeout(async () => {//设置计时器异步获取
        try { //如果没异常
          let res = await getXcxFileList({ page: this.pageNum, limit: this.per_page, relation_id: this.patiendValue }); //请求后端接口 
         // if (this.pageNum === 1) { //如果是第一页把文件夹展示
           // this.fileDirArr = res.folder.data
            //this.fileItemArr = [];
          //}
          const results = res.file.data // 获取接口的数据 
          this.fileItemArr.push(...results) //动态添加到数组里
          // 3将本次加载的loading关闭
          this.loading = false
          // 4判断是否还有数据
          if (results.length) {
            // 有,则更新获取下一个数据的页码
            this.pageNum++
          } else {
            // 没有,则将加载状态finished设置为结束
            this.finished = true
          }
        } catch (err) {
          this.error = true
          this.loading = false
        }
      }, 100)
    },
}

uploadItem.vue

<template>
  <van-cell center :title="listData.file_memo" :value="createTime" :label="userLabel" :icon="headImage"
    class="cell-content" @click="viewImgFun(listData,listIndex)" />
</template>
<script>
import { Cell, List, ImagePreview } from 'vant';
export default {
  props: ['listData', 'listIndex'],
  components: {
    [Cell.name]: Cell,
    [List.name]: List,
    [ImagePreview.name]: ImagePreview,
  },
  data() {
    return {
      createTime: '',
      userLabel: '',
      headImage: '',
    };
  },
}

最后来看一下效果 :