美文网首页
vue上拉加载更多组件

vue上拉加载更多组件

作者: wade3po | 来源:发表于2019-02-11 08:54 被阅读24次

    很久没发布文章了,但其实一直在学习写组件,本来想写个跑马灯组件,但是因为css动画会出现卡顿,就算开启GPU加速还是会,暂时还没有什么好的解决方法,所以有解决方法的欢迎指点一下。

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

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

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

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

    标签:

    <div id="scroll"> <slot></slot></div>

    这边使用了vue的slot插槽。

    data:

    windowHeight: '',contentOffSetHeight: '',downT: ''

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

    Props:

    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:

    window.scrollTo(0, 0);window.removeEventListener('scroll', this.onScroll)

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

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

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

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

    欢迎关注Coding个人笔记 公众号

    相关文章

      网友评论

          本文标题:vue上拉加载更多组件

          本文链接:https://www.haomeiwen.com/subject/chossqtx.html