uniapp利用scroll-view实现滚动触底加载

这篇具有很好参考价值的文章主要介绍了uniapp利用scroll-view实现滚动触底加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

可以使用以下这种方式来做滚动触底加载,但是官网提示长列表性能不太好,目前也没有更好的方式,暂时先这么处理。

<template>
    <scroll-view class="table-container" :scroll-y="true"  @scroll="onScrollEvent">
		...
    </scroll-view>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
    props: {
        ...,
        total: {
            type: Number,
            default: 0,
            require: false
        }
    },
	data() {
        const timeoutId: NodeJS.Timeout = setTimeout(() => { });
		return {
            // 父容器高度
            parentContainerHeight: 0,
			// 定时器初始id
            timeoutId,
            // 记录上一次滚动时,距离顶部的距离
            oldScrollTop: 0,
            // 记录上一次滚动时,距离左边的距离
            oldScrollLeft: 0
		}
	},
    mounted() {
        // 获取表格父容器高度
        this.getContainerConfig(`#${this.tableId}`, (data) => {
            this.parentContainerHeight = data.height;
        });
    },
	methods: {
		/**
         * 滚动事件
         * @e 滚动时的相关参数
         * @scrollHeight 为容器所有列表项的总高
         * @scrollTop 距离顶部的距离
         * 当前容器 = scrollHeight - scrollTop;
         * */
        onScrollEvent(e: { detail: { scrollHeight: number; scrollTop: number; scrollLeft: number }; }) {
            const { scrollHeight, scrollTop, scrollLeft } = e.detail;
            // 如果上一次记录的距离跟当前变化的距离不一致 则表示在向左右滚动 则不执行加载逻辑
            if (this.oldScrollLeft !== scrollLeft) return;
            // 如果上一次记录的数据 比 当前距离顶部的距离大 则说明是在向上滚动 则不执行加载逻辑
            if (this.oldScrollTop > scrollTop) return;
            clearTimeout(this.timeoutId);
            if (scrollHeight - scrollTop < (this.parentContainerHeight + 50)) {
                this.timeoutId = setTimeout(() => {
                    // 记录每一次滚动时 当前位置跟顶部/左右的距离
                    this.oldScrollTop = scrollTop;
                    this.oldScrollLeft = scrollLeft;
                    // 还没有到底部就继续不断的加载
                    if (this.sourceData?.length < this.total) {
                    	// 通知父组件去调用接口请求数据
                        this.$emit('scrollLoadingData');
                    } else {
                        // 已经触到了底部
                    }
                }, 200);
            }
        },
        /**
         * 根据id来获取到容器的信息
         * @id dom元素id
         * @fn 回调函数
         * */
        getContainerConfig(id: string, fn: Function) {
            uni.createSelectorQuery().in(this).select(id).boundingClientRect((data) => {
                // 回调函数带回参数
                fn(data);
            }).exec();
        },
	}
})
</script>

微信小程序官方在scroll-view中也提供了一种触底加载的方式,也没有我写的这么复杂,在uniapp中要改写成vue的方式@scrolltolower才能生效,两个方式各有优劣,选择适合自己的就行了。文章来源地址https://www.toymoban.com/news/detail-545741.html

bindscrolltolower	eventhandle		否	滚动到底部/右边时触发	1.0.0

到了这里,关于uniapp利用scroll-view实现滚动触底加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包