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-上拉加载、下拉刷新组件的更多相关文章

  1. Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记

    之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...

  2. 上拉加载下拉刷新控件WaterRefreshLoadMoreView

    上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...

  3. RecyclerView 上拉加载下拉刷新

    RecyclerView 上拉加载下拉刷新 <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/teach_s ...

  4. APICloud上啦加载下拉刷新模块

    apicloud有自带的上啦加载下拉刷新,当让也可以用第三方或者在模块库里面找一个使用 一.下拉刷新,一下代码写在 apiready = function (){} 里面 apiready = fun ...

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

    微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载 ...

  6. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  7. 基于better-scroll封装一个上拉加载下拉刷新组件

    1.起因 上拉加载和下拉刷新在移动端项目中是很常见的需求,遂自己便基于better-scroll封装了一个下拉刷新上拉加载组件. 2.过程 better-scroll是目前比较好用的开源滚动库,提供很 ...

  8. SwipeRefreshLayout实现上拉加载下拉刷新

    package com.example.swiperefreshlayoutdemo; import java.util.ArrayList;import java.util.HashMap; imp ...

  9. MJRefresh(上拉加载下拉刷新)

    整理自:https://github.com/CoderMJLee/MJRefresh#%E6%94%AF%E6%8C%81%E5%93%AA%E4%BA%9B%E6%8E%A7%E4%BB%B6%E ...

  10. Flutter上拉加载下拉刷新---flutter_easyrefresh

    前言 Flutter默认不支持上拉加载,下拉刷新也仅仅支持Material的一种样式.Android开发使用过SmartRefreshLayout的小伙伴都知道这是一个强大的刷新UI库,集成了很多出色 ...

随机推荐

  1. 【转载】Response对象的作用以及常用方法属性

    Response对象是Asp.Net应用程序中非常重要的一个内置对象,其作用为负责将服务器执行好的信息输出给客户端,即作用主要为响应客户端请求并将服务器的响应返回给用户,在页面的临时跳转中,也可使用R ...

  2. h5 点击ios键盘完成 出现键盘大小的白块

    document.addEventListener('focusout', function (e) { window.scrollTo() }) 源文件链接 https://blog.csdn.ne ...

  3. JS如何做2048(详细)

    在做2048之前,我们首先要了解它的游戏规则,以及运行逻辑 首先,来看上半部分 除了标题外还有记录每次获得的分数,以及总分数,还有一个重新开始按钮,这个最大分数会保存下来. 来看页面内容 页面内容由1 ...

  4. mysql各版本驱动

    http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.9/

  5. android 动画总结一

    一.补间动画 补间动画就是指开发者指定动画的开始.动画的结束的"关键帧",而动画变化的"中间帧"由系统计算,并补齐. 补间动画分为四种:平移动画(Transla ...

  6. Android应用查看本地数据库

    使用Android Studio 视图==>工具窗口 == >Device File Explorer ==> 文件在 data/data目录下,你的应用程序报名,右键save as ...

  7. 前台.cshtml得到cookie值方法

    function Cookie_() { $.ajax({ url: "/Login_/do_cookie",//请求地址 dataType: "json",/ ...

  8. Zabbix MySQL percona 模板部署

    Zabbix MySQL percona服务端执行以下操作https://www.zabbix.com/download?zabbix=4.0&os_distribution=centos&a ...

  9. VS代码自动排版

    1, ctrl+a 2, ctrl+k 3, ctrl+f

  10. Android 通过资源名,获取资源ID

    有时候我们知道一个图片的文件名,我们需要知道在R文件中,该资源的ID,使用如下方法: public static int getIdByName(Context context, String cla ...