react表格(antd)触底加载

该文章演示了如何在React中使用AntDesign表格组件监听滚动条触底事件,从而实现分页加载更多数据的功能。通过定义列类型、设置表格列和数据,结合useRef和滚动事件处理函数,当内容区域接近底部时触发新的数据加载。
摘要由CSDN通过智能技术生成

react表格(antd)触底加载

antd表格监听滚动条触底

import {  useRef } from 'react';
import { Table } from 'antd';
import ReactDOM from 'react-dom';

//用于定义列的类型
interface DataType {
  key: string;
  name: string;
  age: number;
  address: string;
  tags: string[];
}

const scrollRef = useRef<any>();

const columns: ColumnsType<DataType> = [
  {
    title: 'Name',
    dataIndex: 'name',
    key: 'name',
    render: (text) => <a>{text}</a>,
  },
  {
    title: 'Age',
    dataIndex: 'age',
    key: 'age',
  },
  {
    title: 'Address',
    dataIndex: 'address',
    key: 'address',
  },
  {
    title: 'Tags',
    key: 'tags',
    dataIndex: 'tags',
    render: (_, { tags }) => (
      <>
        {tags.map((tag) => {
          let color = tag.length > 5 ? 'geekblue' : 'green';
          if (tag === 'loser') {
            color = 'volcano';
          }
          return (
            <Tag color={color} key={tag}>
              {tag.toUpperCase()}
            </Tag>
          );
        })}
      </>
    ),
  }
];

const data: DataType[] = [];

//生成第一次的数据
for( var i = 0;i < 10;i++){
	data.push({
		    key: i,
		    name: name+i,
		    age: 32,
		    address: 'Sydney No. 1 Lake Park',
		    tags: ['cool', 'teacher'],
	 	 });
}

//用于滚动条触底后重新生成数据
const getData = () = > {
	for( var i = 0;i < 20;i++){
		data.push({
			    key: i,
			    name: name+i,
			    age: 32,
			    address: 'Sydney No. 1 Lake Park',
			    tags: ['cool', 'teacher'],
		 	 });
	}
}

//滚动条处理逻辑
  const onScrollEvent = () => {
    if (dataLoadl) {
      return;
    }

    // 获取表格dom元素
    const table = ReactDOM.findDOMNode(scrollRef.current);
    const tableBody = (table as Element)?.querySelector('.ant-table-body');

    // 容器可视区高度
    const tableBodyHeight: number = tableBody?.clientHeight ? tableBody?.clientHeight : 0;

    // 内容高度
    const contentHeight = tableBody?.scrollHeight ? tableBody?.scrollHeight : 0;

    // 距离顶部的高度
    const toTopHeight = tableBody?.scrollTop ? tableBody?.scrollTop : 0;

    // 如果后端数据总条数小于10 或者滚动条没有出现,不需要再去调用后端去请求数据
    if (toTopHeight === 0 || data.length <= 10) {
      return;
    }

    // 当距离底部只有1时,重新获取数据
    if (contentHeight - (toTopHeight + tableBodyHeight) <= 1) {
      // 如果当前页数据大于等于总页数,则代表没有数据了
      if (tableData.length == data.length) {
        scorll = false;
        message.info('没有更多数据了');
        setDataLoad(false);
        return;
      } else {
        setDataLoad(true);
       //此处刷新数据
       getData();
      }
    }
  }

//显示的内容
return(
	<div onScrollCapture={onScrollEvent}>
		<Table columns={column} dataSource={data} pagination={false} ref={(c) => { scrollRef.current = c }}/>
	</div>
)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值