前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue上拉加载更多组件

vue上拉加载更多组件

作者头像
wade
发布2020-04-24 10:36:33
2K0
发布2020-04-24 10:36:33
举报
文章被收录于专栏:coding个人笔记coding个人笔记

我想,工作一段时间的都碰见过上拉加载更多需求,现在这种插件也蛮多的,也很多是把上拉加载下拉刷新结合。但是这些组件都有一个问题,就是下拉到最底部,刷新浏览器,浏览器会记住这个距离,从而触发上拉加载的方法。虽然这个小问题在正常情况下没什么影响,于是自己就研究研究,写了一个上拉加载更多的组件。

要写上拉加载其实还分两种场景,一种是相对window,也就是相对于可视窗口,一种是在一个容器内。大部分使用场景是相对窗口,所以暂时只写了一个相对于window的。

上拉加载原理简单来说就是判断内容是否到达底部。容器自身的高度加上距离顶部的距离就是现在整个页面的高度。整个页面的高度减去可视窗口的高度再减去滚动条移动的距离,当接近0的时候就是到达底部的时候。

明白了这个原理上拉加载就很好实现了。

标签:

代码语言:javascript
复制
<div id="scroll"> <slot></slot></div>

这边使用了vue的slot插槽。

data:

代码语言:javascript
复制
windowHeight: '',contentOffSetHeight: '',downT: ''

因为可视窗口和距离顶部的距离是不会变的,所以初始化的时候就赋值,downT是监听滚动防抖用的。

Props:

代码语言:javascript
复制
props: ['up', 'bottomDistance'],

up对应的就是父组件传递的到达底部是触发的方法,'bottomDistance'是可以设置到达底部距离多少的时候触发加载更多的方法。

Mounted:

if(history.scrollRestoration){ history.scrollRestoration= 'manual';};this.windowHeight = document.documentElement.clientHeight || document.body.clientHeight;//可视窗口高度this.contentOffSetHeight = document.getElementById('scroll').offsetTop;//容器距离顶部高度window.addEventListener('scroll', this.onScroll);

这边可视窗口采用了兼容的写法,然后history.scrollRestoration这个可以去了解一下,就是不记住滚动的距离,刷新的时候就不会直接触发加载方法。然后监听window滚动。

onScroll() { if(this.downTime){ clearTimeout(this.downTime); }; this.downTime = setTimeout(() => { let contentHeight = document.getElementById('scroll').clientHeight;//容器高度 let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;//窗口滚动条高度 if (contentHeight + this.contentOffSetHeight - this.windowHeight - scrollTop <= (this.bottomDistance || 0)) { //加载更多操作 this.$emit('up') } }, 200);}

加上了节流,bottomDistance不穿默认为0,然后节流设置了200毫秒。

最后beforeDestroy:

代码语言:javascript
复制
window.scrollTo(0, 0);
window.removeEventListener('scroll', this.onScroll)

刷新当前页面或者离开页面的时候移动到最顶部,防止记住滚动条位置,亲测,要是没有设置history.scrollRestoration,vue生命周期会先移动到顶部然后再移动到记住的位置。其实设置了这个移动到顶部也不需要,这边为了稳定就加上了。还有就是要移除监听滚动,我试了,跟定时间计时器一样,没有在组件销毁的时候移除,会一直存在。

要说的是,这边没有写加载更多的动画效果,使用的时候可以自定义一个然后隐藏,在触发加载更多的时候显示,加载完之后隐藏,包括已经到底部,都可以自定义。虽然会稍显麻烦,主要是考虑到我写的估计很多人会不喜欢。

这样看会比较不直观,所以推荐去npm下载一下:

https://www.npmjs.com/package/wade-ui

(完)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 coding个人笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档