vant-list一直显示loading框

当使用vant-list组件时,发现加载完成后仍然显示‘正在加载…’的状态。问题出在封装的vant-list组件中,由于数据处理不当导致loading状态未能正确关闭。解决方案在于修正数据绑定和计算,确保在组件渲染前正确更新data中的值,从而解决loading状态持久化的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上的问题多是页面一直loading数据,而我的问题却是加载完之后还是显示“正在加载…”
vant的List组件通过finished和loading两个属性控制加载结束和加载中,所以一切问题要从这两个属性的赋值上找。

问题根源:

在项目中由于很多页面使用了List,所以我封装了一个vant-list组件。也就是这个万恶的组件害我忙活了一上午。代码太多我贴部分出来。
先概括一下代码意思,方便大家阅读:
(父组件给vant-list组件通过v-bind的方式传递值,vant-list通过pops接收,为了防止vant-list修改父组件的值,所以使用data来保存接收的值再进行使用。)

封装的vant-list组件的DOM:

    <van-list
      v-model="loading"
      :finished="finished"
      @load="loadMore"
    >
      <slot></slot>
    </van-list>

封装的vant-list组件的JS:

  props: {
    vanFinished: {
      type: Boolean,
      default: false
    },
    vanloading: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {    //   也就是这里让我苦不堪言,一切的根源在这里
      loading: this.vanloading,
      finished: this.vanFinished
    };
  },

有了vant-list之后我就在父组件里调用这个组件了。

父组件

    <vant-list
      :vanloading="loading"
      :vanFinished="finished"
      @loadMoreNews="loadMore"
      ref="vantList"
    >

父组件中通过v-bing方式传递的值在vant-list中是实时更新的,但是data并没有,所以在组件打补丁渲染之前要重新计算一次。

解决方法:

在vant-list中:

beforeUpdate() {
    this.finished = this.vanFinished;
  },

在父组件中

    loadMore() {    // loadMore是上拉加载数据的处理函数 ,为了本帖篇幅,我把其它内容删了
          this.$refs.vantList.loading = false;  
          //  由于子组件在更新之前会把loading重新计算,。
          //  在vant-list中的beforeUpdate钩子中更新loading是无效的,
          //  这里采用获取子组件值直接更新的方式
    },
### 实现 Vant List 的下拉刷新功能 Vant 是一个轻量级移动端 Vue 组件库,提供了 `van-pull-refresh` 和 `van-list` 两个核心组件来分别实现下拉刷新和上拉加载的功能。为了实现完整的列表交互体验,通常会将这两个组件结合起来使用。 #### 下拉刷新的核心逻辑 通过 `van-pull-refresh` 组件绑定 `v-model` 属性控制加载状态,并监听其触发的 `refresh` 事件,在该事件中执行数据更新的操作[^1]。当操作完成后,需手动设置 `v-model` 值为 `false` 来结束刷新过程。 以下是具体的代码示例: ```vue <template> <div> <!-- 外层包裹 van-pull-refresh --> <van-pull-refresh v-model="isLoading" @refresh="handleRefresh"> <!-- 内部嵌套 van-list --> <van-list v-model="loading" :finished="finished" finished-text="没有更多了" @load="handleLoad" > <van-cell v-for="(item, index) in list" :key="index" :title="item.title" /> </van-list> </van-pull-refresh> </div> </template> <script> export default { data() { return { isLoading: false, // 控制下拉刷新的状态 loading: false, // 控制上拉加载的状态 finished: false, // 是否已加载完毕 list: [], // 数据列表 page: 1, // 当前页码 totalPage: 1, // 总页数 }; }, methods: { handleRefresh() { // 模拟接口延迟 setTimeout(() => { this.list = []; // 清空原有数据 this.page = 1; // 重置分页参数 this.finished = false; // 取消加载完成标志位 this.handleLoad(); // 调用加载方法重新获取第一页的数据 this.isLoading = false; // 结束刷新状态 this.$toast("刷新成功"); }, 1000); }, handleLoad() { // 模拟异步请求新数据 setTimeout(() => { if (this.page >= this.totalPage) { this.finished = true; // 如果当前页大于等于总页数,则标记加载完成 } else { const newData = Array.from({ length: 10 }).map((_, i) => ({ title: `Item ${(this.page - 1) * 10 + i}`, })); this.list.push(...newData); // 将新数据追加到已有列表中 this.loading = false; // 加载结束后关闭加载状态 this.page += 1; // 更新页码 } }, 500); }, }, }; </script> ``` 上述代码展示了如何结合 `van-pull-refresh` 和 `van-list` 完成下拉刷新与上拉加载的功能。其中需要注意的是,`handleRefresh` 方法会在每次用户触发下拉动作时被调用,而 `handleLoad` 则负责处理上拉加载的需求[^2]。 另外,关于可能遇到的问题之一——`van-list` 的 `finished` 属性可能会因判断条件不当而导致持续加载的情况,可以通过合理管理分页机制以及明确设定何时停止加载来规避此问题[^3]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值