使用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.js(读音 /vju&#720;/, 类似于 view) 是一套构建用户界面的渐进式框架。本文给大家详细介绍了vue解决跨域路由冲突问题思路解析,需要的朋友参考下吧
    2017-11-11
  • 使用Vant如何完成各种Toast提示框

    使用Vant如何完成各种Toast提示框

    这篇文章主要介绍了使用Vant如何完成各种Toast提示框,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • ElementUI实现el-table列宽自适应的代码详解

    ElementUI实现el-table列宽自适应的代码详解

    这篇文章给大家介绍了ElementUI实现el-table列宽自适应的详细步骤,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • vue-element-admin中node-sass换成dart-sass,安装依赖报code 128多种问题的解决方法

    vue-element-admin中node-sass换成dart-sass,安装依赖报code 128多种问题的解决

    这篇文章主要介绍了vue-element-admin中node-sass换成dart-sass,安装依赖报code 128多种问题的解决方法,本文给大家分享问题原因分析及解决方法,需要的朋友可以参考下
    2023-02-02
  • vue结合el-upload实现腾讯云视频上传功能

    vue结合el-upload实现腾讯云视频上传功能

    这篇文章主要介绍了vue结合el-upload实现腾讯云视频上传功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 在Vue3中实现四种全局状态数据的统一管理的方法

    在Vue3中实现四种全局状态数据的统一管理的方法

    在开发中,通常遇到四种全局状态数据:异步数据、同步数据,传统的Vue3使用不同机制处理这些数据,而Zova框架通过Model机制来统一管理,简化了数据处理流程,提高了代码的可维护性,本文介绍在Vue3中实现四种全局状态数据的统一管理的方法,感兴趣的朋友一起看看吧
    2024-10-10
  • vue实现匀速轮播效果

    vue实现匀速轮播效果

    这篇文章主要为大家详细介绍了vue实现匀速轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Vue3 v-bind 指令的基本用法

    Vue3 v-bind 指令的基本用法

    在 Vue 3 中,v-bind 指令用于将表达式的值绑定到 DOM 元素的属性上,这个指令的语法与 Vue 2 相同,但有一些细微的变化和改进,这篇文章主要介绍了Vue3 v-bind 指令的基本用法,需要的朋友可以参考下
    2024-08-08
  • element-ui重置resetFields()不生效的解决

    element-ui重置resetFields()不生效的解决

    本文主要介绍了element-ui重置resetFields()不生效的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • 解决Vue.js Devtools未检测到Vue实例的问题

    解决Vue.js Devtools未检测到Vue实例的问题

    在开发Vue.js应用时,Vue.js Devtools是一个不可或缺的调试工具,然而,有时我们可能会遇到“Vue.js not detected”的提示,这意味着Vue.js Devtools未能成功识别和连接到我们的Vue应用,本文将详细解析这个问题,并提供相应的解决步骤与代码示例,需要的朋友可以参考下
    2024-01-01

最新评论