前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页

Posted ccVue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页相关的知识,希望对你有一定的参考价值。

前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12942

效果图如下:

 


 

 

 

#### 使用方法

```使用方法

<!-- pullDown:下拉刷新 back-top: 回到顶部  -->

<ccPullScroll class="pullScrollView" ref="pullScroll" :back-top="true" :pullDown="pullDown">

</ccPullScroll>

```

#### HTML代码部分

```html

<template>

<view class="content">

<!--  -->

<div class="mui-content-padded">

<!-- pullDown:下拉刷新 back-top: 回到顶部  -->

<ccPullScroll class="pullScrollView" ref="pullScroll" :back-top="true" :pullDown="pullDown">

<!-- 列表组件 -->

<CCBProjectList :productList="projectList" @click="goProDetail"></CCBProjectList>

</ccPullScroll>

</div>

</view>

</template>

```

#### JS代码 (引入组件 填充数据)

```javascript

<script>

import CCBProjectList from \'../../components/ccPageView/CCProjectList.vue\';

import ccPullScroll from \'../../components/ccPullScroll/index.vue\'

export default

components:

CCBProjectList,

ccPullScroll

,

data()

return

// 列表总数量

totalNum: 60,

//  页码 默认1开始

curPageNum: 1,

// 列表数组

projectList: []

,

mounted()

// 页面刷新方法 会自动调用pulldown一次

this.pageRefresh();

,

methods:

pageRefresh()

let myThis = this;

this.$nextTick(() =>

myThis.$refs.pullScroll.refresh();

);

,

pullDown(pullScroll)

console.log(\'下拉刷新\');

this.projectList = [];

this.curPageNum = 1;

setTimeout(() =>

this.requestData(pullScroll);

, 300);

,

// 上拉加载

onReachBottom()

// 数据全部加载完

if (this.curPageNum * 10 >= this.totalNum)

else

this.curPageNum++;

this.requestData();

,

// 列表条目点击事件

goProDetail(item)

,

requestData()

// 模拟请求参数设置

let reqData =

\'area\': \'\',

"pageSize": 10,

"pageNo": this.curPageNum

let myThis = this;

setTimeout(function()

// 模拟请求接口

for (let i = 0; i < 10; i++)

myThis.projectList.push(

\'proName\': \'产品名称\' + i,

\'proUnit\': \'公司名称\' + i,

\'area\': \'广东省\',

\'proType\': \'省级项目\',

\'stage\': \'已开工\',

\'id\': 10 * (myThis.curPageNum + i) + myThis.curPageNum + \'\'

);

// 列表总数量

myThis.totalNum = 60;

// 如果是最后一页

if (myThis.curPageNum * 10 >= myThis.totalNum)

myThis.$refs.pullScroll.finish();

else

// 不是最后一页

myThis.$refs.pullScroll.success();

, 600);

</script>

```

#### CSS

```css

<style>

page

 

.content

display: flex;

flex-direction: column;

.mui-content-padded

margin: 0px 14px;

/* */

.pullScrollView

display: flex;

flex-direction: column;

</style>

```

vue-上拉加载下拉刷新组件

vue在移动端开发过程中,上拉加载、下拉刷新是页面的基本需求,现在给大家介绍一种基于touch事件封装的刷新组件。

组件支持传参、传递事件、请求成功异步回调、上拉与触底触发加载或刷新。

父子组件间的通信

这里我们有两个页面,父组件note.vue与刷新组件baseScroll.vue。

通过Prop向子组件传递数据、通过事件向父组件发送消息、通过插槽slot分发内容。

note:

<base-scroll v-bind:url="url" 
             v-bind:param="param" 
             @send-data="sendData" 
             ref="baseScroll">
  <div slot="content">
    <!--内容区-->
  </div>
</base-scroll>

这里我们note页面向子组件传递了请求地址、参数,sendData则用来接收子组件的事件回调。

baseScroll:

props:{
        // 请求数据的地址
        url:‘‘,
        // 请求参数
        param:{
            type: Object,
        },
        // 每页显示数据条数
        pageSize: {
            default:10
        },
        pageNoName: {
            default: ‘page_no‘
        },
        pageSizeName: {
            default: ‘page_size‘
        },
 }

下拉刷新、上拉加载触发条件

组件里面我们使用touch相关事件来达到刷新、加载的效果。

baseScroll:

<div class="vue-scroll"
    @touchstart="touchStart($event)"
    @touchmove="touchMove($event)"
    @touchend="touchEnd($event)"> 
    <slot name="content"></slot>
</div>

其实机制很简单,就是上滑到页面顶部触发刷新,滑动到页面触底触发数据加载 。关键我们要通过偏移量来判断什么时候刷新或加载。这里有篇详细介绍页面偏移量的文章,点我传送门

baseScroll:

touchStart(e) {  
    // 屏幕高度
    this.clientHeight=parseInt(`${document.documentElement.clientHeight}`) 
    //滚动开始页面距顶距离
    this.scrollTopStart=window.scrollY    
    // 页面高度                 
    this.pageHeight=e.currentTarget.clientHeight
    // 触摸距离页面起点
    this.startY = e.targetTouches[0].pageY 
    // 触摸距离屏幕起点 
    this.clientY = e.targetTouches[0].clientY
},
touchEnd(e) {
    if(!this.hasMove)return
    this.hasMove=false
    // 滚动结束页面距顶距离
    this.scrollTopEnd=window.scrollY 
    var sLength=this.scrollTopEnd-this.scrollTopStart
    if(this.clientHeight+this.startY+sLength+15>=this.pageHeight+this.clientY){
        this.nextPage()  //页面加载
    }else if(this.startY+sLength<=this.clientY){
        this.refresh()  //页面刷新
    }     
},
touchMove(e) {
    this.hasMove=true
},
touchStart拿到滚动起点的位置及其他页面或屏幕高度;touchEnd中通过判断滚动的值来确定是加载或刷新;hasMove值用来区分用户的操作是点击还是滑动。

加载数据、执行回调

确认后是下拉刷新还是上拉加载后,我们执行相应的操作。

baseScroll:

refresh(){
    this.currPageNo = 1
    this.getData(data=>{
       
    },0)
},
nextPage(){
    this.getData(data => {
    }, 1)
},
getData(callback, type){
    var self=this
    // 设置分页参数
    if (typeof this.param === ‘string‘) {
      this.param = JSON.parse(this.param);
    }
    this.param[this.pageNoName]=this.currPageNo
    this.param[this.pageSizeName]=this.pageSize
    $.ajax({
        type: "get",
        url: this.url,
        data: this.param,
        dataType: ‘json‘,
        success: function (res) {
            var data=res.data
            callback(data)
            self.currPageNo += 1;     
            self.$emit(‘send-data‘, data,type)            
        },
    })
},

这里我是调用接口获取数据然后$emit(‘send-data‘,data,type)传递数据给父组件,当然页面数据上的操作显示就交给父组件进行模板渲染,子组件内部可以做些加载、刷新的动画显示。

并且只要涉及到页面分页、需要上拉下拉操作的页面都可以复用该组件,只是接口地址、参数不同!

 






以上是关于前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页的主要内容,如果未能解决你的问题,请参考以下文章

JS或者jquery的上拉加载和下拉刷新是怎么实现的

vue-上拉加载下拉刷新组件

微信小程序下拉刷新上拉加载

微信小程序下拉刷新上拉加载

Android开发之头部悬浮的上拉加载,下拉刷新的列表

为啥使用mui的上拉刷新下拉加载后在电脑上的刷新加载正常手机上就不正常了