vue 上拉加载更多

效果图如下所示

上拉加载

下面直接说原理

浏览器监听滚动条,当滚动条的超出部分的距离+屏幕的可视高度>文档的高度,触发触底函数。

获取代码

 window.addEventListener('scroll', function(){
                    // topHeight就是滚动条超出顶部的部分高度
                    let topHeight = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
                      //documentHeight 为文档流的高度
                    let documentHeight = document.documentElement.clientHeight
                      //bodyHeight 窗口的可视高度
                    let bodyHeight=document.body.clientHeight
                    if(topHeight + bodyHeight >= documentHeight){
                    ###虽然以上代码能触发触底函数,但是由于监听滚动条的滚动过于密 
                    ###集,所以会触发多次触底函数,简单的通过data中设置是否标记参数 
                    ###依然能够进来两个请求,不能够及时断开,所以需要加上如下代码
                   if(!that.timer){
                        that.timer = setTimeout(() => {
                                  //do something about touchBottom
                                }, 1000)
                          }
                    }
               
})

总结

Vue不像小程序那样,js中自带onReachBottom触底函数,在vue中,需要自己写触发条件,如上是我查阅了网络上的一些文章整理出来的,再此感谢前人的经验分享,整理记录,以备后面自己迷茫时候翻阅查看。

2020/7/4号,发现vue中有更好的插件解决上拉加载,特来补充(以下部分属于转载,转载链接已经标注至文末)

一 安装

使用npm 安装
npm install vue-scroller -d

二 引入

import VueScroller from "vue-scroller"
Vue.use(VueScroller);

三 使用

   <tab>
         <tab-item @on-item-click="e=>tabChange(0)" v-bind:selected="selectTabIndex=='0'?true:false">未验收</tab-item>
        <tab-item @on-item-click="e=>tabChange(1)" v-bind:selected="selectTabIndex=='1'?true:false">已验收</tab-item>
      </tab>
 <scroller :on-refresh="refresh" :on-infinite="infinite" ref="my_scroller" >
<scroller>

在methods方法中增加refresh和infinite2个方法。

  methods: {
    /**
     * 下拉刷新
     */
    refresh() {
      console.log("refresh");
      this.pageNumber = 1;
      this.getOrderList(this.selectTabIndex);
    },

    /**
     * 上拉获取
     */
    infinite(done) {
      this.pageNumber++;
      console.log("infinite");
      this.getOrderList(this.selectTabIndex, done);
    },
    /**
     * 左右滑动设置初始值
     */
    setInitParas(){
      this.pageNumber = 1;
      this.setloadingshow();
      this.items=[]
      this.$refs.my_scroller.finishInfinite(false);
    },
 /**
     * 获取台账列表参数信息
     */
    getOrderParams(index) {
      //index为1表示已验货,0表示未验货 2
      let dbconsignee_phone = localStorage.getItem("dbconsignee_phone");
      var searchData = {
        dbordernumber: "", //提货单号
        dbconsignee_phone: dbconsignee_phone, //手机号码
        acceptance_status: index,
        pageSize:5, //一页多少数
        pageNumber: this.pageNumber, //页码
        order: "",
        sort: ""
      };
      return searchData;
    },

    setloadingshow() {
      this.$vux.loading.show({
        text: "加载中"
      });
    },

    /**
     * 获取台账列表信息
     */
    getOrderList(index, done) {
      const that = this;
      this.selectTabIndex = index;
      const searchData = this.getOrderParams(this.selectTabIndex);
      const params = {
        url: "/receiver/bill/order/datalist",
        reqparams: {
          cmdData: JSON.stringify(searchData)
        },
        onSuccess(data) {
          that.$vux.loading.hide();
          const billJson = JSON.parse(data);
          const newOrderItem = that.formatterOrderData(billJson.rows);
          if (newOrderItem.length > 0) {
            that.items = that.items.concat(newOrderItem);
          }
          if(typeof(done)=="function"){
            done();
          }
          that.$refs.my_scroller.finishPullToRefresh();
          if ( that.pageNumber >= billJson.pageCount ||billJson.pageCount == 0 ) {
            that.$refs.my_scroller.finishInfinite(true);
          }
        }
      };
      http.getData(params);
    },
 }

四 使用的坑

  • 1 做的功能中左右切换使用的是同一个scroller,当一个数据加载完毕,切换到另外一个,不可以上拉获取数据。
    在切换tab页的时候调用this.$refs.my_scroller.finishInfinite(false)
    finishInfinite函数为scroller实例的方法,当参数为false时,上拉获取数据可以重新调用。当参数为true,上拉获取数据回调函数停止使用,下拉下部不再显示loading,会显示‘’暂无更多数据

  • 下拉刷新,刷新完毕,loading动画一直存在不消失。
    需要手动调用finishPullToRefresh。停止下拉刷新。
    调用方式:this.$refs.my_scroller.finishPullToRefresh();

  • infinite的回调函数done调用时间
    将后台获取的数据,复制到vue组件的数据源后,再进行调用done函数。如果在之前调用,会循环调用。如果不调用这个函数,上拉获取数据函数调用不成功。

并附官网API

API

翻译了一部分经常使用的

Attr. Name Description Required Default Value
onRefresh 下拉刷新 N -
onInfinite 上拉获取数据 N -
refreshText pull-to-refresh的提示信息 N 下拉刷新
noDataText 当全部数据加载完毕提示信息 N 没有更多数据
width scroller container width N 100%
height scroller container height N 100%
snapping enable snapping mode N false
snappingWidth snapping width N 100 (stand for 100px)
snappingHeight snapping height N 100
refreshLayerColor text color of pull-to-refresh layer N #AAA
loadingLayerColor text color of infinite-loading layer N #AAA
minContentHeight min content height (px) of scroll-content N 0

Scroller vm instance methods:

  • resize() resize scroller content (已经废弃)
  • triggerPullToRefresh() 触发下拉刷新
  • finishPullToRefresh() 完成下拉刷新.可以手动调用
  • finishInfinite(isNoMoreData :Boolean) 当参数为false时,上拉获取数据可以重新调用。当参数为true,上拉获取数据回调函数停止使用,下拉下部不再显示loading,会显示‘’暂无更多数据
  • scrollTo(x:Integer, y:Integer, animate:Boolean) scroll to a position in scroller content
  • scrollBy(x:Integer, y:Integer, animate:Boolean) scroll by a position in scroller content
  • getPosition :Object get current position of scroller content

作者:单只蝴蝶_569d
链接:https://www.jianshu.com/p/a39f5276ff0b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容