当前位置: 代码网 > it编程>编程语言>Javascript > 使用Vue简单实现一个上拉加载更多分页组件

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

2024年11月25日 Javascript 我要评论
效果展示体验地址jyeontu.xyz/jvuewheel/#/jpagecontentview实现思路1、组件模板结构<template> <div class="j-pag

效果展示

体验地址

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分页组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com