虚拟列表ant

62 阅读1分钟
import { Space, Table, Tag } from 'antd';
import React, { useEffect,useState } from 'react';
import './index.css';
const columns = [
  {
    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>
//           );
//         })}
//       </>
//     ),
//   },
//   {
//     title: 'Action',
//     key: 'action',
//     render: (_, record) => (
//       <Space size="middle">
//         <a>Invite {record.name}</a>
//         <a>Delete</a>
//       </Space>
//     ),
//   },
];
let datas = []
    for(let i=0;i<10000;i++){
            datas.push({
                key:'' + i,
                name: '' + i
            })
}
// const data = [
//   {
//     key: '1',
//     name: 'John Brown',
//     age: 32,
//     address: 'New York No. 1 Lake Park',
//     tags: ['nice', 'developer'],
//   },
//   {
//     key: '2',
//     name: 'Jim Green',
//     age: 42,
//     address: 'London No. 1 Lake Park',
//     tags: ['loser'],
//   },
//   {
//     key: '3',
//     name: 'Joe Black',
//     age: 32,
//     address: 'Sidney No. 1 Lake Park',
//     tags: ['cool', 'teacher'],
//   },
// ];

const Home = () => {
    let allHeight = 500
    let lineHeight = 55
    let pageCount = Math.round(allHeight / lineHeight)
    const [tableData, setTableData] = useState(datas.slice(0, pageCount))
    // setTableData(datas.slice(0, pageCount))
    const handleTableScroll = () => {
        let dom = document.querySelector('.ant-table-body')
        var div = document.createElement("div");  //创建段落元素
        div.style.height= 10000*lineHeight + 'px'
        div.style.position = 'absolute'
        div.style.width = '1px'
        div.className = 'myDiv'
        dom.insertBefore(div,dom.children[0]);
        dom.addEventListener('scroll', () => {
            // // 滚动距离
            let scrollTop = dom.scrollTop
            let startIndex = Math.floor(scrollTop / lineHeight);
            let endIndex = Math.ceil((scrollTop + allHeight) / lineHeight);
            setTableData(datas.slice(startIndex, endIndex))
            // 列表移动距离
            let startOffset = scrollTop - (scrollTop % lineHeight);
            let tableBody = document.querySelector('tbody') 
            tableBody.style.transform =  `translate3d(0,${startOffset}px,0)`
        })
    }
    useEffect(() => {
       handleTableScroll()
    },[])
    return (
        <Table
            columns={columns}
            dataSource={tableData}
            scroll={{ y: 500 }}
           pagination={false}/>
    )
};

export default Home

.ant-table-wrapper{
    overflow: hidden;
}
.ant-table-body{
    position: relative;
}