使用el-table做一个滚动到底部自动加载数据的功能,类似于el-table上拉加载

<template>
    <div ref="tableWrapRef" class="table-wrap">
        <el-table :data="messageInfo.content" style="width: 100%" class="mg-t-20">
            <el-table-column type="index" width="50" />
            <el-table-column label="信息">
                <template #default="{ row }">
                    <div>昵称:{{ row.shopName }}</div>
                    <div>ID:{{ row.shopNameId }}</div>
                </template>
            </el-table-column>
            <el-table-column label="店铺ID" prop="shopId" />
            <el-table-column label="用户信息">
                <template #default="{ row }">
                    <div>用户名:{{ row.userName }}</div>
                    <div>用户ID:{{ row.userId }}</div>
                </template>
            </el-table-column>
        </el-table>
        <div class="bottom-text" v-if="messageInfo.content.length >= total">
            没有啦,真的没有啦~
        </div>
    </div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
// 接口
import { getMarkHistory } from '@/service';
import { throttle } from 'lodash';

const tableWrapRef = ref();
const messageInfo = ref({
    traceId: '',
    content: [],
});
const canNext = ref(true);
const resultVal = ref({});

onMounted(() => {
    for (let num = 0; num < 20; num++) {
        messageInfo.value.content.push({
            aaa: 1,
        });
    }
    tableWrapRef.value.addEventListener(
        'scroll',
        throttle(async function () {
            const scrollDistance = this.scrollHeight - this.scrollTop - this.clientHeight;
            if (scrollDistance <= 30 && canNext.value) {
                canNext.value = false;
                // 重点
                const topVal = this.scrollTop;
                await getData();
                await this.scrollTo(0, topVal);
                // 重点
                setTimeout(() => {
                    resultVal.value.content?.length && (canNext.value = true);
                }, 500);
            }
        }, 300)
    );
});

async function getData() {
    const result = await getMarkHistory({
        pageNum: 1,
        pageSize: 20,
    });
    if (messageInfo.value.content?.length >= 300) {
        result.content = [];
    }
    resultVal.value = result;
    messageInfo.value.content = [...messageInfo.value.content, ...result.content];
}
</script>
<style lang="less" scoped>
.table-wrap {
    max-height: 700px;
    overflow: auto;
    padding-bottom: 20px;

    overscroll-behavior: contain;

    .bottom-text {
        text-align: center;
        height: 30px;
        line-height: 30px;
        margin-top: 25px;
        font-size: 14px;
    }
}
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值