vant-list上拉刷新问题

vant-list页面加载数据出现的问题

问题1:页面加载完全部数据时,再次搜索调用数据接口不会再实现上拉刷新分页,只会渲染第一页内容?
问题2:将滚动条滚动到中间时,再次搜索调用接口会调用两遍接口导致页面将第一页内容渲染两遍?

vant组件库中vant-list代码片段

List 组件通过 loading 和 finished 两个变量控制加载状态
当组件滚动到底部时,会触发 load 事件并将 loading 设置成 true。
此时可以发起异步操作并更新数据,数据更新完毕后,将 loading 设置成 false 即可。
若数据已全部加载完毕,则直接将 finished 设置成 true 即可。

进入页面加载数据

<van-list
  v-model="loading"
  :finished="finished"
  finished-text="没有更多了"
  @load="onLoad"
>
  <van-cell v-for="item in list" :key="item" :title="item" />
</van-list>
export default {
  data() {
    return {
      list: [],
      loading: false,
      finished: false,
    };
  },
  methods: {
    onLoad() {
      // 请求更新数据
      fetchData()
        // 加载状态结束
        this.loading = false;
        // 数据全部加载完成
        this.finished = true;
    },
    //请求数据
    fetchData() {
      Toast.loading({
        duration: 0,
        message: "加载中...",
        forbidClick: true,
        loadingType: "spinner",
      });
      return GetSteelQueryPageSteelList({
        PageInfo,
        SteelName: sessionStorage.getItem("SteelName"),
      })
        .then((res) => {
          if (res.IsSucceed) {
            this.PageInfo.TotalCount = res.Data.TotalCount;
            if (this.refreshing) {
              this.list = [];
              this.PageInfo.Page = 2;
              this.refreshing = false;
              this.list = res.Data.Data;
            } else {
              this.list = [...this.list, ...res.Data.Data];
              if (this.list.length < this.PageInfo.TotalCount) {
                this.PageInfo.Page++;
              }
            }
          } else {
            Toast.loading({
              type: "warning",
              duration: 1000,
              message: res.Message,
            });
            Toast.clear();
          }
        })
        .finally(() => {
          this.loading = false;
          if (this.list.length >= this.PageInfo.TotalCount) {
            this.finished = true;
          }
          Toast.clear();
        });
    },
  },
};

如果添加搜索功能需要更新数据时

 fetchDataConfirm() {
      if (this.steelName == "") {
        return Toast("请输入关键字");
      }
      this.list = []; //搜索后将列表置为空
      this.PageInfo.Page = 1;//搜索后请求数据从第一页开始
      this.loading = true;//重新加载页面
      this.finished = false;//加载页面完成状态置为false
      this.refreshing = false; //下拉刷新
      this.fetchData();//重新调用接口请求数据
    },
触发点击事件重新调用接口时,需要将
this.loading = true;
this.finished = false;
  1. 问题1:页面加载完全部数据时,再次搜索调用数据接口不会再实现上拉刷新分页,只会渲染第一页内容?
    由于页面全部加载结束后页面中变为this.finished = true;并且一直保持加载完毕的状态上拉加载则失效,页面只会请求一次数据不分页,甚至会造成页面布局有问题所以再次请求数据时必须将```this.finished = false;``
  2. 问题2:将滚动条滚动到中间时,再次搜索调用接口会调用两遍接口导致页面将第一页内容渲染两遍?
    当页面滚动条滑到中间位置时变为this.loading = false;表示数据加载完毕,如果再次搜索时需要再次调用接口,此时认为数据加载完毕会默认再次执行一遍onLoad()函数,导致接口被调用了两次,所以再刚开始重新调用接口时要this.loading = true;表示还在加载中不需要再次调用onLoad()函数了!

再书写移动端页面时一定要注意列表的上拉刷新,和下拉刷新这两个组件的使用和参数再每个函数中的变化!!!

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值