在开发uni-app项目时,mescroll组件是一个很好解决下拉刷新、上拉加载的组件,它的流畅性很好,现在还没发现啥大问题

链接:http://www.mescroll.com/api.html?v=20200807

最好下载引用包,不要使用npm,全局会报错

 

这里只是借用了它的方法,没有按它原始的配置来做

目前使用的是mescroll-uni组件,相当于scroll-view局部滑动

下面是我已经写完测试的demo

  

 

html部分

  

<template>
    <view class="box">
        <view class="tab_box">
            <view class="tab_list" :class="tab_index===index?'tab_on':''" v-for="(item,index) in tab_list" @click="tabChange(index)">{{item}}</view>
        </view>
        <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="refreshChange" @up="loadChange" :down="down" :up="up" :fixed="true" :top="80">
            <block v-for="(item,index) in list" :key='index' >
                <view class="list">
                    <view class="name">{{item.name}}</view>
                    <view class="value">{{item.value}}</view>
                </view>
            </block>
        </mescroll-uni>
    </view>
</template>
mescrollInit:初始化回调,返回mescroll对象
refreshChange:下拉回调,返回mescroll对象
loadChange:上拉回调,返回mescroll对象
fixed:是否使用固定定位,默认会自动计算高度
height:使用高度,则fixed不生效
up、down:参数详见文档

js部分
<script>
    import MescrollMixin  from '@/components/mescroll-uni/mescroll-mixins.js'
    import MescrollUni from "@/components/mescroll-uni/mescroll-uni.vue"
    export default {
        name: "approval-temp",
        data(){
          return{
              mescroll:null,
              up:{
                  auto:false //默认开始不执行上拉
              },
              down:{
                  auto:false //默认开始不执行下拉
              },
              list:[],
              hasNext:true,  //上拉是否有值
              tab_list:['索隆','山治'],
              tab_index:0
          }
        },
        mixins:[MescrollMixin], //引入mescroll内置方法
        components:{
            MescrollUni
        },
        mounted() {
            let list=[]
            let tmp1={
                name:'多弗朗明哥',
                value:'100'
            }
            let tmp2={
                name:'路飞',
                value:'99'
            }
            for(let i=0;i<5;i++){
                let new_tmp1=JSON.parse(JSON.stringify(tmp1))
                let new_tmp2=JSON.parse(JSON.stringify(tmp2))
                new_tmp1.name+=i
                new_tmp2.name+=i
                list.push(new_tmp1,new_tmp2)
            }
            this.list=list
        },
        methods:{
            mescrollInit(mescroll) {
                console.log('mescrollInit')
                this.mescroll = mescroll;
            },
            refreshChange(data={}){
                console.log('refresh')
                this.mescroll.removeEmpty()  //移除空布局,主要是第一次无值,第二次有值
                this.mescroll.showUpScroll()//显示上拉加载,主要用于标签1加载完END,切换标签2时默认替换END(有切换标签时调用)
                this.list=[]
                this.hasNext=true  //初始化有值
                this.page_no=1
                this.getList(data);
            },
            loadChange(){
                console.log('load')
                this.page_no++
                this.getList();
            },
            getList(data={}){
                let page_no=this.page_no
                let params={
                    page_no,
                }
                params={...params,...data}
                this.requestData(params).then(()=>{ //模拟请求
                    if(!this.list.length){    //这里是通过list总长度判断的
                        this.mescroll.endUpScroll(false)    //隐藏上拉加载,false为隐藏,其他参考文档(有showUpScroll时调用)
               this.mescroll.endDownScroll()     //隐藏下拉刷新
                        this.mescroll.showEmpty()           //显示空布局
                    }else {
                        this.mescroll.endSuccess(20,this.hasNext)  //数量大于默认数量10,否则无法上拉加载,或者修改endSuccess原方法
                    }
                });
            },
            requestData(data){
                let temp={
                    name:'大妈',
                    value:'666'
                }

                return new Promise(resolve => {
                    setTimeout(()=>{
                        let list=this.list;
                        let arr=[]
                        for(let i=0;i<10;i++){
                            let new_tmp=JSON.parse(JSON.stringify(temp))
                            new_tmp.name+=i
                            arr.push(new_tmp)
                        }

                        if(data.page_no===1){
                            list=arr
                        }else {
                            list=list.concat(arr)
                        }
                        this.list=list
                       if(this.list.length>20){  //默认结束
                           this.hasNext=false
                       }
                       resolve();
                    },500)
                })
            },
            tabChange(index){
                if(this.tab_index!==index){
                    this.tab_index=index;
                    this.refreshChange();
                }
            }
        }
    }
</script>