上一篇讲到在项目中使用上拉加载更多组件,但是由于实际项目开发中由于需求变更或者说在webview中上拉加载有些机型在上拉时候会把webview也一起上拉导致上拉加载不灵敏等问题,我们有时候也会换成滑动到底部自动加载的功能。

既然都是加载更多,很多代码思想势必相似,主要区别在于上拉和滑动到底部这个操作上,所以,我们需要注意:
上拉加载是point指针touch触摸事件,现在因为是滑动加载,需要添加scroll事件去监听然后执行相应回调
上拉加载主要计算触摸滚动距离,滑动加载主要计算container底部和视窗上边缘的距离
事件绑定改成:
mounted() {
···
this.dom.addEventListener('scroll', this.scroll, false)
···
},
beforeDestroy() {
···
this.dom.removeEventListener('scroll', this.scroll, false)
···
},
事件回调改为:
/**
* 滚动钩子
*/
scroll() {
const viewHeight = global.innerHeight
let parentNode
if (this.container !== global) {
parentNode = this.$el
} else {
parentNode = this.$el.parentNode
}
if (parentNode) {
// 获取Vue实例使用的根 DOM 元素相对于视口的位置
const rect = parentNode.getBoundingClientRect()
// this.distance 离底部多少距离开始加载
// 如果此元素底边距离视口顶部的距离小于视口高度加上distance之和,就加载下一页
if ((rect.bottom <= viewHeight + this.distance) && this.loadable && !this.loading) {
this.load()
}
}
},
源码如下:
<template>
<div class="loadmore" ref="loadmore">
<div class="loadmore__body">
<slot></slot>
</div>
<div class="loadmore__footer">
<span v-if="loading">
<i class="tc-loading"></i>
<span>正在加载</span>
</span>
<span v-else-if="loadable">加载更多</span>
<span v-else>没有更多了</span>
</div>
</div>
</template>
<script type="text/babel">
import axios from 'axios'
const CancelToken = axios.CancelToken
export default {
data() {
return {
/**
* 总页数(由服务端返回)
* @type {number}
*/
count: 0,
/**
* 是否正在拖拽中
* @type {boolean}
*/
dragging: false,
/**
* 已加载次数
* @type {number}
*/
times: 0,
/**
* 已开始记载
* @type {boolean}
*/
started: false,
/**
* 正在加载中
* @type {boolean}
*/
loading: false,
dom: null,
}
},
props: {
/**
* 初始化后自动开始加载数据
*/
autoload: {
type: Boolean,
default: true,
},
/**
* 离组件最近的可滚动父级元素(用于监听事件及获取滚动条位置)
*/
container: {
// Selector or Element
default: () => (global),
},
/**
* Axios请求参数配置对象
* {@link https://github.com/mzabriskie/axios#request-config}
*/
options: {
type: Object,
default: null,
},
/**
* 起始页码
*/
page: {
type: Number,
default: 1,
},
/**
* 每页加载数据条数
*/
rows: {
type: Number,
default: 10,
},
/**
* 数据加载请求地址
*/
url: {
type: String,
default: '',
},
/**
* 距离底部多远加载
*/
distance: {
type: Number,
default: 200,
},
},
computed: {
/**
* 是否可以加载
* @returns {boolean} 是与否
*/
loadable() {
return !this.started || (this.page + this.times) <= this.count
},
},
mounted() {
if (this.container !== global) {
this.dom = document.querySelector(this.container)
} else {
this.dom = this.container
}
if (!this.dom) {
return
}
this.dom.addEventListener('scroll', this.scroll, false)
if (this.autoload && !this.loading) {
this.load()
}
},
// eslint-disable-next-line
beforeDestroy() {
if (this.dom) {
this.dom.removeEventListener('scroll', this.scroll, false)
}
},
methods: {
/**
* 滚动钩子
*/
scroll() {
const viewHeight = global.innerHeight
let parentNode
if (this.container !== global) {
parentNode = this.$el
} else {
parentNode = this.$el.parentNode
}
if (parentNode) {
const rect = parentNode.getBoundingClientRect()
if ((rect.bottom <= viewHeight + this.distance) && this.loadable && !this.loading) {
this.load()
}
}
},
/**
* 加载一组数据的方法
*/
load() {
if (this.loading) {
return
}
this.started = true
this.loading = true
const params = {
currentPage: this.page + this.times,
pageSize: this.rows,
}
const options = Object.assign({}, this.options, {
url: this.url,
cancelToken: new CancelToken((cancel) => {
this.cancel = cancel
}),
})
if (String(options.method).toUpperCase() === 'POST') {
options.data = Object.assign({}, options.data, params)
} else {
options.params = Object.assign({}, options.params, params)
}
this.$axios.request(options).then((res) => {
const data = res.result
this.times += 1
this.loading = false
this.count = data.pageCount
this.$emit('success', data.list)
this.$emit('complete')
}).catch((e) => {
this.loading = false
this.$emit('error', e)
this.$emit('complete')
})
},
/**
* 重置加载相关变量
*/
reset() {
this.count = 0
this.times = 0
this.started = false
this.loading = false
},
/**
*重新开始加载
*/
restart() {
this.reset()
this.load()
},
},
}
</script>
以上所述是小编给大家介绍的vue loadmore 组件滑动加载更多源码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# vue
# loadmore
# 滑动加载更多
# 基于Vue实现页面切换左右滑动效果
# Vue实现移动端左右滑动效果的方法
# vue实现一个移动端屏蔽滑动的遮罩层实例
# vue2.0移动端滑动事件vue-touch的实例代码
# vue中选项卡点击切换且能滑动切换功能的实现代码
# vue-router 手势滑动触发返回功能
# vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
# 使用Vue 实现滑动验证码功能
# Vue实现固定定位图标滑动隐藏效果
# 使用vue制作滑动标签
# Vue 实现从小到大的横向滑动效果详解
# 加载
# 回调
# 小编
# 都是
# 也会
# 多远
# 下一页
# 在此
# 每页
# 给大家
# 会把
# 或者说
# 上一篇
# 相对于
# 在上
# 讲到
# 所述
# 绑定
# 需要注意
# 正在加载
相关文章:
代刷网站制作软件,别人代刷火车票靠谱吗?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
图册素材网站设计制作软件,图册的导出方式有几种?
定制建站流程步骤详解:一站式方案设计与开发指南
如何在云虚拟主机上快速搭建个人网站?
如何通过多用户协作模板快速搭建高效企业网站?
如何通过VPS搭建网站快速盈利?
网站制作企业,网站的banner和导航栏是指什么?
如何通过VPS建站无需域名直接访问?
广州美橙建站如何快速搭建多端合一网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
宝塔面板创建网站无法访问?如何快速排查修复?
网站制作网站,深圳做网站哪家比较好?
内网网站制作软件,内网的网站如何发布到外网?
建站之星在线版空间:自助建站+智能模板一键生成方案
非常酷的网站设计制作软件,酷培ai教育官方网站?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何使用Golang table-driven基准测试_多组数据测量函数效率
如何选择适配移动端的WAP自助建站平台?
c++怎么用jemalloc c++替换默认内存分配器【性能】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
网站制作免费,什么网站能看正片电影?
制作网页的网站有哪些,电脑上怎么做网页?
电商网站制作公司有哪些,1688网是什么意思?
建站主机选择指南:服务器配置与SEO优化实战技巧
如何通过虚拟主机快速完成网站搭建?
如何快速生成橙子建站落地页链接?
如何选择高效便捷的WAP商城建站系统?
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
网站企业制作流程,用什么语言做企业网站比较好?
个人摄影网站制作流程,摄影爱好者都去什么网站?
利用JavaScript实现拖拽改变元素大小
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何配置WinSCP新建站点的密钥验证步骤?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
建站之星CMS五站合一模板配置与SEO优化指南
C#怎么使用委托和事件 C# delegate与event编程方法
常州企业建站如何选择最佳模板?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站之星展会模板:智能建站与自助搭建高效解决方案
建站之星伪静态规则如何正确配置?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何在IIS中新建站点并配置端口与物理路径?
网站制作员失业,怎样查看自己网站的注册者?
孙琪峥织梦建站教程如何优化数据库安全?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。