import React, { useEffect, useState } from 'react'; import { Avatar, List, message } from 'antd'; import VirtualList from 'rc-virtual-list'; interface UserItem { email: string; gender: string; name: string; avatar: string; } const CONTAINER_HEIGHT = 400; const PAGE_SIZE = 20; const App: React.FC = () => { const [data, setData] = useState([]); const [page, setPage] = useState(1); const appendData = (showMessage = true) => { const fakeDataUrl = `https://660d2bd96ddfa2943b33731c.mockapi.io/api/users/?page=${page}&limit=${PAGE_SIZE}`; fetch(fakeDataUrl) .then((res) => res.json()) .then((body) => { const results = Array.isArray(body) ? body : []; setData(data.concat(results)); setPage(page + 1); showMessage && message.success(`${results.length} more items loaded!`); }); }; useEffect(() => { appendData(false); }, []); const onScroll = (e: React.UIEvent) => { // Refer to: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#problems_and_solutions if ( Math.abs(e.currentTarget.scrollHeight - e.currentTarget.scrollTop - CONTAINER_HEIGHT) <= 1 ) { appendData(); } }; return ( {(item: UserItem) => ( } title={{item.name}} description={item.email} />
Content
)}
); }; export default App;