【完全指南】vue+vant实现上拉加载下拉刷新,加速你的页面响应速度

前言

当我们在使用移动端应用时,经常会遇到需要上拉加载更多数据或下拉刷新数据的功能。而基于 vue 框架和 vant 库,实现这样的功能将会变得十分简单和便捷。本文将介绍如何使用 vant 组件库实现上拉加载和下拉刷新功能,并为读者提供详细的代码示例和演示效果。如果你想让你的移动端应用更加流畅和用户友好,那么不要错过这篇文章!


实现思路

下拉刷新:

请求接口赋完值后,将接口返回数据长度与总条数进行比较控制加载不加载的状态,在下拉刷新方法中定义起始页码为第一页,调整加载的状态为 false,最后调用请求数据的接口方法,做适当轻提示即可。

上拉加载:

首先在data中定义一个新的数组用于将新加载的数据与老的数据合并,在上拉加载方法中让加载的页码递增,然后请求接口进行赋值,将接口返回数据循环并将数据添加到list数组中,将返回数据长度与总条数进行比较控制加载不加载的状态实现上拉加载。


话不多说,下面进入实例开发。以下是我为了方便大家理解做的一个小 demo,大家可以根据相关代码及注释快速上手操作。

<template>
    <div>
        <!-- van-pull-refresh:下拉刷新 -->
        <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
            <!-- 上拉加载 -->
            <van-list v-model="loading" :finished="finished" :immediate-check="false" finished-text="没有更多了"
                @load="onLoad" :offset="20">
                <div class="outerBox" v-for="(item,index) in list" :key="index">
                    <div>公司名称:{{item.gsmc}}</div>
                    <div>行业类别:{{item.hylb}}</div>
                    <div>进车限值:{{item.jcxz}}</div>
                </div>
            </van-list>
        </van-pull-refresh>
    </div>
</template>
<script>
    import {getPassAnalysisList} from '@/api/enforcement' //引入接口文件
    export default {
        data() {
            return {
                //传递给后端的参数
                incomePayData: {
                    pageNumber: 1, //请求第几页
                    pageSize: 10, //每页请求的数量
                },
                list: [], //列表数据
                listTwo: [], //用于上拉加载时将数据合并
                total: 0, //总页数
                isLoading: false, //下拉刷新
                loading: false, //上拉加载
                finished: false, //加载与不加载的状态
            }
        },
        mounted() {
            this.getPassAnalysisList(); //列表数据接口
        },
        methods: {
            //列表数据接口
            getPassAnalysisList() {
                getPassAnalysisList(this.incomePayData).then(res => {
                    if (res.code == '10000') {
                        this.list = res.data.records; //将接口返回赋值data定义的数组
                        this.total = res.data.total; //将接口返回的总数据条数赋值data中定义的total
                        if (this.list.length >= this.total) { //将返回数据长度与总条数进行比较控制加载不加载的状态
                            this.finished = true;
                        }
                    }
                })
            },
            //下拉刷新
            onRefresh() {
                this.incomePayData.pageNumber = 1; //起始为第一页
                this.finished = false; //加载与不加载的状态
                setTimeout(() => {
                    this.isLoading = false; //下拉刷新状态
                    this.getPassAnalysisList() //刷新成功调用列表方法
                    this.$toast('刷新成功'); //轻提示信息
                }, 700);
            },
            //上拉加载
            onLoad() {
                this.incomePayData.pageNumber++; //加载时页码递增
                getPassAnalysisList(this.incomePayData).then(res => {
                    if (res.code == '10000') {
                        this.listTwo = res.data.records; //将接口返回赋值data定义的数组
                        this.total = res.data.total; //将接口返回的总数据条数赋值data中定义的total
                        this.listTwo.forEach(item => { //循环返回的数据并将数据添加到list中
                            this.list.push(item)
                        })
                        // 加载状态结束 状态更新为false
                        this.loading = false;
                        if (this.list.length >= this.total) { //将返回数据长度与总条数进行比较控制加载不加载的状态
                            this.finished = true;
                        }
                    }
                })
            },
        }
    }
</script>
<style scoped>
    /* 外层盒子的样式 */
    .outerBox {
        padding: 10px;
        box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.3),
            0px 0px 20px rgba(0, 0, 0, 0.1) inset;
        margin: 0px 16px 16px 16px;
        overflow: hidden;
    }
</style>

实现效果

在这里插入图片描述


第二种实现方式

<template>
  <div class="containerBox">
    <!-- 下拉刷新组件 -->
    <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
      <!-- 列表组件 -->
      <van-list v-model="loading" :finished="finished" :finished-text="bomTitle" @load="onLoad" :offset="20">
        <!-- 列表项 -->
        <div v-for="(item, index) in list" :key="index" class="listBox">
          <div>
            <span>联系人</span>
            <span>{{ item.lxr ? item.lxr : "--" }}</span>
          </div>
          <div>
            <span>电话</span>
            <span>{{ item.lxdh ? item.lxdh : "--" }}</span>
          </div>
          <div>
            <span>地址</span>
            <span>{{ item.qydz ? item.qydz : "--" }}</span>
          </div>
        </div>
      </van-list>
    </van-pull-refresh>
  </div>
</template>

<script>
// 接口文件
import { informPort } from '@/api/entrance/index'
export default {
  data() {
    return {
      dataSet: {
        limit: 20,
        page: 1,
        qymc: ''
      },
      list: [], // 列表数据
      isLoading: false, // 控制下拉刷新的加载状态
      loading: false, // 控制上拉加载的加载状态
      finished: false, // 是否已加载完全部数据
      bomTitle: '' // 上拉加载完成时的文本
    }
  },
  methods: {
    // 获取列表数据
    informPort(flag) {
      informPort(this.dataSet).then(res => {
        if (res.code == 10000 && res.data) {
          let dataList = res.data.records
          if (dataList && dataList.length) {
            if (flag) {
              this.list = dataList
            } else {
              this.list = [...this.list, ...dataList]
            }
          }
          this.pageTotal = res.data.total
          this.loading = false
          if (this.list.length >= this.pageTotal) {
            this.bomTitle = '到底了~ ' + '共计' + res.data.total + '条'
            this.finished = true
          } else {
            this.dataSet.page += 1
            this.bomTitle = ''
          }
        }
      })
    },
    // 搜索
    onSearch() {
      this.dataSet.page = 1
      this.finished = false
      this.list = []
      this.informPort(true)
    },
    // 下拉刷新
    onRefresh() {
      this.dataSet.page = 1
      this.finished = false
      this.list = []
      setTimeout(() => {
        this.isLoading = false // 结束下拉刷新的加载状态
        this.informPort(true) // 重新获取列表数据
        this.$toast('刷新成功')
      }, 300)
    },
    // 上拉加载
    onLoad() {
      this.informPort() // 获取更多列表数据
    }
  }
}
</script>

相关推荐

让你的微信小程序对用户更加友好:上拉加载和下拉刷新就是关键

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值