import React, { useState, useEffect } from 'react';
const InfiniteScroll = () => {
const [data, setData] = useState([]);
const [page, setPage] = useState(1);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchData();
}, []);
const fetchData = () => {
setLoading(true);
// 模拟异步请求数据
setTimeout(() => {
const newData = [...data];
for (let i = 0; i< 10; i++) {
newData.push(`Item ${newData.length + i + 1}`);
}
setData(newData);
setLoading(false);
setPage(page + 1);
}, 1000);
};
const handleScroll = (event) => {
const { scrollTop, clientHeight, scrollHeight } = event.currentTarget;
if (scrollHeight - scrollTop === clientHeight && !loading) {
fetchData();
}
};
return (
{data.map((item, index) => ({item}
))}
{loading &&Loading...}
);
};
export default InfiniteScroll;
在ReactJS中,实现无限滚动加载是一项常见的需求。本文将介绍一种简单的实现方式,无需借助第三方库。
我们首先创建一个名为InfiniteScroll的无状态组件。通过useState Hook来管理数据、当前页数和加载状态。
const [data, setData] = useState([]);
const [page, setPage] = useState(1);
const [loading, setLoading] = useState(true);
在组件渲染完成后,调用useEffect Hook来触发数据的初始化请求,并将页面初始化为第一页。
useEffect(() => {
fetchData();
}, []);
fetchData函数模拟异步请求数据,在请求成功后更新data、loading状态,并递增页面数。
const fetchData = () => {
setLoading(true);
setTimeout(() => {
const newData = [...data];
for (let i = 0; i < 10; i++) {
newData.push(`Item ${newData.length + i + 1}`);
}
setData(newData);
setLoading(false);
setPage(page + 1);
}, 1000);
};
handleScroll函数监听滚动事件,当滚动到底部且加载状态为false时,触发数据加载。
const handleScroll = (event) => {
const { scrollTop, clientHeight, scrollHeight } = event.currentTarget;
if (scrollHeight - scrollTop === clientHeight && !loading) {
fetchData();
}
};
在组件的render函数中,渲染滚动容器并遍历显示数据。当数据加载时,显示"Loading..."提示。
return (
<div style={{ height: '400px', overflow: 'auto' }} onScroll={handleScroll}>
{data.map((item, index) => (
<div key={index}>{item}
))}
{loading && <div style={{ textAlign: 'center' }}>Loading...}
</div>
);
以上为ReactJS中实现无限滚动加载的简单示例。你可以根据具体情况进行定制和扩展,实现更复杂的无限滚动效果。