使用Vue简单实现一个上拉加载更多分页组件

 更新时间:2024年11月18日 08:24:45   作者:JYeontu  
上拉加载更多的分页功能大家应该都见过或者使用过了吧,那么有多少同学自己实现过吗,本文我们来简单实现一个上拉加载更多分页组件吧

效果展示

体验地址

jyeontu.xyz/jvuewheel/#/JPageContentView

实现思路

1、组件模板结构

<template>
    <div class="j-page-content" ref="scrollable" @scroll="handleScroll">
        <slot></slot>
        <div v-if="loading" class="loading-indicator">{{ moreText }}</div>
    </div>
</template>
  • 可滚动容器:最外层是一个内容容器,并且设置了 @scroll 事件监听器,当用户滚动这个容器时,会触发 handleScroll 方法。
  • 内容插槽<slot> 元素用于接收外部传入的内容。这意味着使用者可以在使用该组件时,将需要展示的列表项或者其他内容放置在这个组件内部,灵活性很高。
  • 加载提示:当 loadingtrue 时,会显示一个带有加载文本的 div。加载文本通过 moreText 属性传入,默认值为 "加载中..."。这个加载提示元素位于容器底部。

2、组件属性(props)

props: {
    moreText: {
        type: String,
        default: "加载中...",
    },
    threshold: {
        type: String,
        default: "20",
    },
}
  • moreText:用于定义加载提示文本的内容。外部使用者可以根据自己的应用场景和语言需求,自定义这个文本。
  • threshold:用于设置判断接近容器底部的阈值。默认值为 "20",它表示当距离容器底部的距离小于等于这个阈值时,触发加载更多的操作。这个值可以根据实际的设计需求和视觉效果进行调整。

3、组件数据(data)

data() {
    return {
        loading: false,
        isNearBottom: false,
        scrollableElement: null,
        isloading: false,
    };
}
  • loading:用于表示当前是否正在加载更多数据。初始值为 false,当触发加载更多操作时,设置为 true,加载完成后再重置为 false
  • isNearBottom:用于判断是否接近容器底部。通过在滚动事件处理中计算得到,初始值为 false
  • scrollableElement:用于存储可滚动容器的引用。在组件挂载(mounted)阶段获取到对带有 ref="scrollable"div 的引用。
  • isloading:这是一个额外的加载状态标识,用于在加载过程中防止多次触发加载更多操作。初始值为 false,在触发加载更多操作时设置为 true,并在加载完成后的短暂延迟后重置为 false

4、组件生命周期(mounted)

mounted() {
    this.scrollableElement = this.$refs.scrollable;
}

这里通过 this.$refs.scrollable 获取到在模板中定义的可滚动容器的引用,并将其赋值给 scrollableElement,以便在后续的滚动事件处理中使用。

5、组件方法(methods)

(1) handleScroll 方法

handleScroll() {
    if (this.isloading) return;
    const scrollTop = this.scrollableElement.scrollTop;
    const clientHeight = this.scrollableElement.clientHeight;
    const scrollHeight = this.scrollableElement.scrollHeight;

    // 判断是否接近底部
    this.isNearBottom =
        scrollTop + clientHeight >= scrollHeight - this.threshold;

    if (this.isNearBottom &&!this.loading) {
        this.loading = true;
        this.isloading = true;
        this.$emit("loadMore");
    }
}
  • 首先,该方法会检查 isloading 的状态,如果正在加载(isloadingtrue),则直接返回,避免多次触发加载操作。
  • 然后,获取可滚动容器的当前滚动位置(scrollTop)、可视区域高度(clientHeight)以及整个可滚动内容的高度(scrollHeight)。通过计算判断是否接近底部(scrollTop + clientHeight >= scrollHeight - this.threshold)。
  • 如果接近底部且当前没有在加载(!this.loading),则将 loadingisloading 都设置为 true,并通过 this.$emit("loadMore") 向外抛出一个名为 loadMore 的自定义事件。父组件可以监听这个事件来执行加载更多数据的操作。

(2)loadMoreComplete 方法

loadMoreComplete() {
    this.loading = false;
    setTimeout(() => {
        this.isloading = false;
    }, 100);
}

当父组件完成加载更多数据的操作后,应该调用这个方法。它首先将 loading 设置为 false,表示加载操作已完成。然后,通过 setTimeout 设置一个 100 毫秒的延迟后,将 isloading 也设置为 false。这样的延迟是为了确保在加载完成后的短暂时间内不会再次触发加载更多操作,避免可能出现的问题。

组件使用

<template>
    <div class="content" style="height: 500px">
        <JPageContent @loadMore="loadMoreData" ref="JPageContent">
            <div v-for="n in nums" :key="n">
                <div
                    style="
                        height: 100px;
                        width: 400px;
                        text-align: center;
                        line-height: 100px;
                        border: 1px solid gray;
                    "
                >
                    JPageContent-{{ n }}
                </div>
            </div>
        </JPageContent>
    </div>
</template>
<script>
export default {
    data() {
        return {
            nums: 10,
        }
    },
    methods: {
        loadMoreData() {
            if (this.nums >= 30) {
                this.$refs.JPageContent.loadMoreComplete();
                return;
            }
            setTimeout(() => {
                this.nums += 10;
                this.$refs.JPageContent.loadMoreComplete();
            }, 1000);
        }
    }
}
</script>

组件库

组件文档

目前该组件也已经收录到我的组件库,组件文档地址如下: jyeontu.xyz/jvuewheel/#/JPageContentView

到此这篇关于使用Vue简单实现一个上拉加载更多分页组件的文章就介绍到这了,更多相关Vue分页组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue关于接口请求数据过大导致浏览器崩溃的问题

    vue关于接口请求数据过大导致浏览器崩溃的问题

    这篇文章主要介绍了vue关于接口请求数据过大导致浏览器崩溃的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 使用vue构建多页面应用的示例

    使用vue构建多页面应用的示例

    这篇文章主要介绍了使用vue构建多页面应用的示例,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-10-10
  • 谈谈因Vue.js引发关于getter和setter的思考

    谈谈因Vue.js引发关于getter和setter的思考

    最近因为公司的新项目决定使用Vue.js来做,但在使用的过程中发现了一个有趣的事情,因为发现的这个事情展开了一些对于getter和setter的思考,具体是什么下面通过这篇文章来一起看看吧,有需要的朋友们可以参考学习。
    2016-12-12
  • vue elementui二次封装el-table带插槽问题

    vue elementui二次封装el-table带插槽问题

    这篇文章主要介绍了vue elementui二次封装el-table带插槽问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 关于Vue在ie10下空白页的debug小结

    关于Vue在ie10下空白页的debug小结

    这篇文章主要给大家介绍了关于Vue在ie10下空白页的debug相关资料,这是最近在工作中遇到的一个问题,通过查找相关的资料终于解决了,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • el-menu如何根据多层树形结构递归遍历展示菜单栏

    el-menu如何根据多层树形结构递归遍历展示菜单栏

    这篇文章主要介绍了el-menu根据多层树形结构递归遍历展示菜单栏,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • vue2.0 + ele的循环表单及验证字段方法

    vue2.0 + ele的循环表单及验证字段方法

    今天小编就为大家分享一篇vue2.0 + ele的循环表单及验证字段方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue3.0路由自动导入的方法实例

    vue3.0路由自动导入的方法实例

    这篇文章主要给大家介绍了关于vue3.0路由自动导入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • vue cli3 配置 stylus全局变量的使用方式

    vue cli3 配置 stylus全局变量的使用方式

    这篇文章主要介绍了vue cli3 配置 stylus全局变量的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 前端Vue3图像编辑功能实现代码(并生成mask图)

    前端Vue3图像编辑功能实现代码(并生成mask图)

    随着互联网的飞速发展,图片编辑已经成为人们日常生活中经常使用的一项技能,下面这篇文章主要介绍了前端Vue3图像编辑功能实现的相关资料,并生成mask图,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09

最新评论