Прокрутка страниц в таблицах Ant Design

У меня есть таблица из ANTD и в ней много страниц, так как я определил для нее нумерацию страниц, Я хочу, чтобы можно было также прокручивать таблицу и переходить на следующую страницу, когда пользователь прокручивает таблицу до конца.

это мой компонент:

 <Table columns = {columns} dataSource = {filteredData}
                title = {() => <>  <h3>title</h3>}
                rowClassName = "rowClassName"
                pagination = {{
                    onChange: cancel,
                }}
            />

Как мне это сделать?

🤔 А знаете ли вы, что...
React позволяет создавать пользовательские интерфейсы для веб-приложений.


246
1

Ответ:

Решено

Проверьте, достигает ли прокручиваемый контейнер .ant-table-body дна; если полоса прокрутки достигает дна, перейдите на следующую страницу. После изменения нумерации страниц прокрутите прокручиваемый контейнер вверх.

import React, { useEffect, useLayoutEffect, useState } from 'react';
import './index.css';
import { Table } from 'antd';
import type { TableColumnsType } from 'antd';

interface DataType {
  key: React.Key;
  name: string;
  age: number;
  address: string;
}

const columns: TableColumnsType<DataType> = [
  {
    title: 'Name',
    dataIndex: 'name',
    width: 150,
  },
  {
    title: 'Age',
    dataIndex: 'age',
    width: 150,
  },
  {
    title: 'Address',
    dataIndex: 'address',
  },
];

const data: DataType[] = [];
for (let i = 0; i < 100; i++) {
  data.push({
    key: i,
    name: `Edward King ${i}`,
    age: 32,
    address: `London, Park Lane no. ${i}`,
  });
}

function calculatePage(pageSize: number, total: number) {
  return Math.floor((total - 1) / pageSize) + 1;
}

const allPage = calculatePage(10, data.length);

const App: React.FC = () => {
  const [pagination, setPagination] = useState({ current: 1, pageSize: 10 });

  useEffect(() => {
    const $tableBody = document.querySelector('.ant-table-body');
    const onScroll = () => {
      if (
        Math.abs(
          $tableBody.scrollHeight -
            $tableBody.scrollTop -
            $tableBody.clientHeight
        ) < 1
      ) {
        console.info('reach bottom');
        if (pagination.current < allPage) {
          setPagination((pre) => ({ ...pre, current: pre.current + 1 }));
        }
      }
    };
    if ($tableBody) {
      $tableBody.addEventListener('scroll', onScroll);
    }

    return () => {
      if ($tableBody) {
        $tableBody.removeEventListener('scroll', onScroll);
      }
    };
  }, [pagination]);

  // scroll to top when pagination changes
  useLayoutEffect(() => {
    const $tableBody = document.querySelector('.ant-table-body');
    if ($tableBody) {
      $tableBody.scrollTop = 0;
    }
  }, [pagination]);

  return (
    <Table
      columns = {columns}
      dataSource = {data}
      total = {data.length}
      pagination = {pagination}
      onChange = {(pagination) => {
        setPagination(pagination);
      }}
      scroll = {{ y: 240 }}
    />
  );
};

export default App;

стекблиц


Интересные вопросы для изучения

Проблема с перехватчиком Axios реагирует на Redux и NodeКак удалить один символ из состояния в реакции библиотеки?NextJS – попытка вызвать find() с сервера, но поиск находится на клиентеКак установить все мои параметры как выбранные по умолчанию, и все значения параметров должны отображаться в поле при выборе реакции при множественном выбореКак поместить кнопку очистки внутри модального окна календаря в компоненте antd datepicker?Как зациклить и упростить код нескольких кнопок боковой прокрутки, которые прокручивают определенную строку в JavaScript?На странице бритвы моего серверного приложения Blazor у меня есть iframe, который должен прокручиваться до конца страницы при загрузке страницы бритвы. Как мне это сделать?Разделение экрана Visual Studio Code IDE в одном файле (не требуется)Как сделать просмотр списка с автоматической прокруткой?Прокрутка списка людей в списке Facebook не работает, если курсор мыши не находится на полосе прокрутки