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. 在我的电脑中删除wps云文档图标

    在我的电脑中删除wps云文档图标 右键点击win10左下角选择运行,输入regedit打开注册表后,找到以下注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Wi ...

  2. android studio 开发环境配置

    android studio 开发环境配置 参考: 第一次使用Android Studio时你应该知道的一切配置 https://www.cnblogs.com/qianguyihao/p/43909 ...

  3. leetcode算法题(4)

    问题描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 我的解答: package Simple; public class RoamnInt { public static ...

  4. ECMAScript5面向对象技术(1)--原始类型和引用类型

    概述 大多数开发者在使用Java或C#等基于类的语言的过程中学会了面向对象编程.由于JavaScript没有对类的正式支持,这些开发者在学习JavaScript时往往会迷失方向: JavaScript ...

  5. UI5-技术篇-Hybrid App-1-Barcode扫描

    参考资料: https://www.w3cschool.cn/cordova/cordova_overview.html https://blogs.sap.com/2017/01/03/sapui5 ...

  6. shell脚本编写mind

    首先我们要缩小这个问题的范围 如果在面试中被问到这样的问题,说说shell脚本编写思路 如:你是在公司主要负责zabbix监控的 对答如下:shell脚本这个说法挺广的,您看我这么跟您说吧,我在平时工 ...

  7. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...

  8. JDBC-DBUtils工具-[课本293]-ResultSetHander接口的三种实现类的BeanHander/BeanListHander/ScalarHander

    ---恢复内容开始--- ResultSetHander接口 1.使用BeanHandler()只返回第一行结果集 ,封装到一个对应的JavaBean中 ;eg: User user=(User)bd ...

  9. Jmeter - 生成Html报告

    同步更新至个人博客:https://njlife.top/2019/07/12/Jmeter-%E7%94%9F%E6%88%90Html%E6%8A%A5%E5%91%8A/ Jmeter GUI提 ...

  10. Ajax的简单例子——PHP

    PHP PHP是一种创建动态交互性站点的服务器端脚本语言 PHP能够生成动态页面内容 PHP能够创建.打开.读取.写入.删除以及关闭服务器上的文件 PHP能够接收表单数据 PHP能够发送并取回cook ...