猿创征文|vue vant-ui数据列表上拉加载更多,下拉刷新功能

⭐️⭐️⭐️  作者:船长在船上
 主页:来访地址船长在船上的博客
 简介:CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。

  感谢:如果觉得博主的文章不错或者对你的工作有帮助或者解决了你的问题,可以关注、支持一下博主,如果三连收藏支持就会更好,在这里博主不胜感激!!!如有疑问可以留言、评论,看到后会及时回复。

功能需求:获取后端接口返回的数据,实现列表数据上滑加载更多下一页数据,下拉数据刷新功能,结合vant-ui框架实现。可直接参考使用。

下拉刷新效果:

猿创征文|vue vant-ui数据列表上拉加载更多,下拉刷新功能_第1张图片

目录

知识点速记

基本用法

下拉刷新

代码实现 

1.页面布局

2.样式

3.方法


知识点速记

基本用法

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

下拉刷新

List 组件可以与PullRefresh组件结合使用,实现下拉刷新的效果。

 注意事项:

  • v-model :  是否处于加载状态,加载过程中不触发load事件
  • finished: 是否已加载完成,加载完成后不再触发load事件
  • offset : 滚动条与底部距离小于 offset 时触发load事件
  • loading-text 加载过程中的提示文字
  • finished-text 加载完成后的提示文字

List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  • 非加载中,loadingfalse,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  • 加载中,loadingtrue,表示正在发送异步请求,此时不会触发load事件
  • 加载完成,finishedtrue,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束

事件使用:@load方法

滚动条与底部距离小于 offset 时触发

代码实现 

1.页面布局

2.样式

.myOrder{
  height: 100vh;
  overflow-y: auto;
}
::v-deep.van-cell {
  font-size: 14px;
}
.capaIttem {
  box-shadow: 0px 0px 10px 0px rgba(0,0,0,0.06);
  border-radius: 24px;
  background: #fff;
  position: relative;
}
::v-deep.van-cell {
  padding: 10px 0;
}
::v-deep.van-cell {
  font-size: 40px;
  line-height: 40px;
  font-size: 30px;
}

::v-deep.van-field__left-icon .van-icon {
  font-size: 30px;
}
::v-deep.van-tag {
  font-size: 24px;
  line-height: 40px;
}
::v-deep.van-button--small {
  height: 60px;
  font-size: 24px;
}
::v-deep.van-tabs--line .van-tabs__wrap {
  height: 88px;
}
::v-deep.van-tab {
  font-size: 30px;
}

.searchBtnFixed {
  position: fixed;
  top: 0;
  left: 80px;
  height: 92px;
  line-height: 92px;
  z-index: 1000;
  width: 86%;
  overflow: hidden;
}
::v-deep.van-search {
  position: absolute;
  top: -8px;
  // padding: 13px;
  width: 100%;
}
::v-deep.van-search__content {
  background: #eeeeee;
  border-radius: 16px;
  padding: 5px 10px;
}
.focusSearch ::v-deep.van-icon-clear {
  padding-right: 160px;
}
// 搜索
.onSearch {
  position: absolute;
  right: 50px;
  top: 28px;
  font-size: 30px;
  height: 36px;
  line-height: 36px;
  border-left: 1px solid #cccccd;
  padding-left: 30px;
  color: #024ee0;
}
// 新增
.focus-con {
  display: flex;
  justify-content: space-between;
  border-bottom: 1px solid #ebedf0;
  padding-bottom: 20px;
}
.capa-title {
  border-bottom: 1px solid #ebedf0;
  padding-bottom: 20px;
  display: flex;
  align-items: center;
}
.focus-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-weight: 600;
}
.vipIcon {
  width: 72px;
  height: 34px;
}
.capa-box {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-bottom: 10px;
}
.capa-body {

  background: #f5f8ff;
  border-radius: 0.13333rem;
  padding: 0.33333rem;
}
.capa-con {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-weight: 600;
}
.content-left,
.content-right {
  display: flex;
  justify-content: space-between;
  align-items: center;
  img {
    width: 0.5rem;
    height: 0.5rem;
  }
}
.capa-time {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.time-img {
  display: flex;
  align-items: center;
}
.capaImg {
  width: 30px;
}
.timeColor {
  font-weight: 700;
  color: #024ee0;
}
.order-group {
  display: flex;
  align-items: center;
}
.ellipsis-orderNumber{
  span{
    display: inline-block;
    width: 310px;
  }
}
.ellipsis-txt {
  display: inline-block;
  max-width: 200px;
  text-align: start;
}
.shipName {
  font-weight: 600;
  display: flex;
  align-items: center;
}
.orderNameWidth{
  max-width: 220px;
}
.ellipsis-content{
  width: 400px;
}
.priceContent{
  display: flex;
  justify-content: flex-end;
}
.floatRight{
  float: right;
}
.borderRaduis {
  border-radius: 10px;
  height: 56px;
  .van-button__text {
    font-size: 26px;
  }
}
.huoIcon{
  width: 26px;
  height: 26px;
}
.tagStyle{
  background-color: #fff !important;
}
.contactTel {
  width: 90%;
  border-radius: 10px;
}
.popup-header{
  height: 100px;
  text-align: center;
  color:#fff;
  background: #024EE0;
  line-height: 100px;
}
.contactTel ::v-deep.van-popup__close-icon--top-right{
  top:26px !important;
  color:#fff !important;
}
.popup-box{
  margin:60px 50px 30px;
}
.popup-btn{
  width: 100%;
  border-radius: 20px;
  font-size: 36px;
}

.popupTitle {
  box-sizing: border-box;
  padding: 35px 0 61px 0;
  font-size: 32px;
  color: #333333;
  font-weight: 500;
}
.imgContent {
  display: flex;
  align-items: center;
  justify-content: space-around;
  flex-wrap: wrap;
  margin-bottom: 30px;
  padding: 0 10px;
  li {
    width: 125px;
    height: 125px;
    margin-bottom: 37px;
    background-color: black;
    margin-right: 25px;
  }
  li:nth-of-type(4n) {
    margin-right: 0;
  }
}

3.方法

data数据定义:

data() {
    return {
      
      zwdd:require("../../assets/img/zwdd.png"),
      titleName: "我要开票",
      arrowTrue: true,
      page: 1,
      pageSize: 10,
      isLoading: false,
      loading: false,
      finished: false,
      noData: false,
      contractData: [],
      timer:null,
    };
  },

加载更多方法onLoad

// 加载更多
    onLoad() {
      this.loading = true;
      this.timer = setTimeout(() => {
        this.page++;
        this.getInvoicingContractListFun();
      }, 1000);
    },

下拉刷新方法onRefresh:下拉刷新调用接口,并且页数=1

    // 刷新
    onRefresh() {
      this.isLoading = true;
      this.page = 1;
      if (this.contractData.length == 0) {
        this.isLoading = false;
      }
      this.getInvoicingContractListFun();
    },

处理数据列表方法getInvoicingContractListFun:

调用接口,传递相应的参数,获取到数据,去判断处理数据数据的加载,数据合并操作,利用定义的loading、finished、isLoading控制数据上拉数据加载。

    // 数据列表方法
    getInvoicingContractListFun() {
      let params = {
        carrierUserId: this.id,
        pageNum: this.page,
        pageSize: this.pageSize
      };
      getInvoicingContractList(params)
        .then(res => {
          if (res.code == 200) {
            if (this.contractData.length > 0) {
              this.noData = false;
              //当请求前有数据时 第n次请求
              if (this.loading) {
                // 上拉加载
                this.contractData = this.contractData.concat(res.data.records); //上拉加载新数据添加到数组中
                this.$nextTick(() => {
                  //在下次 DOM 更新循环结束之后执行延迟回调
                  this.loading = false; //关闭上拉加载中
                });
                if (res.data.records.length == 0) {
                  //没有更多数据
                  this.finished = true; //上拉加载完毕
                }
              }
              if (this.isLoading) {
                //关闭下拉刷新
                this.isLoading = false; //关闭下拉刷新中
                this.contractData = res.data.records; //重新给数据赋值
                if (this.finished) {
                  //如果上拉加载完毕为true则设为false。解决上拉加载完毕后再下拉刷新就不会执行上拉加载问题
                  this.finished = false;
                }
              }
            } else {
              this.noData = false;
              this.loading = false;
              this.isLoading = false;
              this.finished = false;
              //当请求没有数据时 第一次请求
              if (res.data.records.length == 0) {
                this.noData = true;
              } else {
                this.contractData = res.data.records;
              }
            }
          } else {
        
            this.$toast(res.msg);
          }
        })
        .catch(error => {});
    },

created中调用方法获取数据

created(){
    //方法调用
    this.getInvoicingContractListFun();
}

 最后在beforeDestroy生命周期清除定时器

beforeDestroy() {
    clearTimeout(this.timer);
    this.timer = null;
}

  欢迎来访船长在船上的博客,文章持续更新;如有疑问可以留言、评论,看到后会及时回复。   

你可能感兴趣的:(Vue,javascript,前端开发,vue.js,javascript,前端)