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

文章介绍了如何在Vue组件中使用scroll-view进行滚动触底加载的实现,包括监听滚动事件、性能考虑以及与微信小程序中@scrolltolower事件的对比。作者提到了在uni-app中需要将原生事件改写为vue方式,并指出选择合适的方法取决于具体需求。
摘要由CSDN通过智能技术生成

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

<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才能生效,两个方式各有优劣,选择适合自己的就行了。

bindscrolltolower	eventhandle		否	滚动到底部/右边时触发	1.0.0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值