react-infinite-scroll-component 用数组加载更多
react-infinite-scroll-component load more with array
我正在尝试对我的数组数据进行无限滚动。我看到的大多数示例都使用了 API 调用,并且它包含了 pages
但我在使用数组和值来设置每次滚动加载多少对象时遇到了麻烦。这是我的代码。
import React, { useState, useEffect } from 'react'
import PropTypes from 'prop-types'
import InfiniteScroll from 'react-infinite-scroll-component'
const Scroll = ({ tweets }) => {
const [allTweets, setAllTweets] = useState(tweets)
const [hasMore, setHasmore] = useState(true)
const [lastPosition, setLastPosition] = useState(0)
const perPage = 4
const loadProducts = () => {
setTimeout(() => {
setAllTweets(...allTweets, tweets.slice(lastPosition, lastPosition + perPage))
}, 4000)
setLastPosition(lastPosition + perPage)
}
useEffect(() => {
loadProducts()
}, [allTweets])
return (
<InfiniteScroll
dataLength={allTweets.length}
next={loadProducts}
hasMore={hasMore}
endMessage={
<p style={{ textAlign: 'center' }}>
<b>Yay! You have seen it all</b>
</p>
}
loader={<h4>Loading...</h4>}
>
<div className="flex flex-col">
{allTweets &&
allTweets.slice(lastPosition, lastPosition + perPage).map((value, index) => {
return <div className="py-10 px-5">{value.body}</div>
})}
</div>
</InfiniteScroll>
)
}
export default Scroll
我对你想做的事情做了 semi-functioning example。请注意,此插件似乎只有在 可以滚动 时才有效。如果您的内容不够高,无法强制滚动,那么新内容将永远无法加载:
App.js
import React from "react";
import Scroll from "./Scroll";
const App = () => {
const initialTweets = [
{ body: "Body 1" },
{ body: "Body 2" },
{ body: "Body 3" },
{ body: "Body 4" },
{ body: "Body 5" },
{ body: "Body 6" },
{ body: "Body 7" },
{ body: "Body 8" },
{ body: "Body 9" },
{ body: "Body 10" }
];
return (
<div>
<h1>demo: react-infinite-scroll-component</h1>
<hr />
<Scroll tweets={initialTweets} />
</div>
);
};
export default App;
Scroll.jsx
import React, { useCallback, useState } from "react";
import InfiniteScroll from "react-infinite-scroll-component";
const Scroll = ({ tweets }) => {
const [allTweets, setAllTweets] = useState(tweets);
const [hasMore, setHasmore] = useState(true);
const [lastPosition, setLastPosition] = useState(0);
const perPage = 4;
const loadProducts = useCallback(() => {
setTimeout(() => {
setAllTweets((prev) => [...prev, ...prev]);
}, 2000);
setLastPosition(lastPosition + perPage);
}, []);
console.log(allTweets);
return (
<InfiniteScroll
dataLength={allTweets.length}
next={loadProducts}
hasMore={hasMore}
loader={<h4>Loading...</h4>}
>
<div className="flex flex-col">
{allTweets.map((value, index) => (
<div key={index} className="py-10 px-5">
{value.body}
</div>
))}
</div>
</InfiniteScroll>
);
};
export default Scroll;
您需要进行一些调整才能完全按照您的意愿行事,但这应该会为您指明正确的方向。
注意:要在 codesandbox 中查看这项工作,请缩小演示 window 以便您可以滚动或将更多对象添加到 initialTweets
数组中。此外,您可以在 project's homepage.
上找到许多示例
我正在尝试对我的数组数据进行无限滚动。我看到的大多数示例都使用了 API 调用,并且它包含了 pages
但我在使用数组和值来设置每次滚动加载多少对象时遇到了麻烦。这是我的代码。
import React, { useState, useEffect } from 'react'
import PropTypes from 'prop-types'
import InfiniteScroll from 'react-infinite-scroll-component'
const Scroll = ({ tweets }) => {
const [allTweets, setAllTweets] = useState(tweets)
const [hasMore, setHasmore] = useState(true)
const [lastPosition, setLastPosition] = useState(0)
const perPage = 4
const loadProducts = () => {
setTimeout(() => {
setAllTweets(...allTweets, tweets.slice(lastPosition, lastPosition + perPage))
}, 4000)
setLastPosition(lastPosition + perPage)
}
useEffect(() => {
loadProducts()
}, [allTweets])
return (
<InfiniteScroll
dataLength={allTweets.length}
next={loadProducts}
hasMore={hasMore}
endMessage={
<p style={{ textAlign: 'center' }}>
<b>Yay! You have seen it all</b>
</p>
}
loader={<h4>Loading...</h4>}
>
<div className="flex flex-col">
{allTweets &&
allTweets.slice(lastPosition, lastPosition + perPage).map((value, index) => {
return <div className="py-10 px-5">{value.body}</div>
})}
</div>
</InfiniteScroll>
)
}
export default Scroll
我对你想做的事情做了 semi-functioning example。请注意,此插件似乎只有在 可以滚动 时才有效。如果您的内容不够高,无法强制滚动,那么新内容将永远无法加载:
App.js
import React from "react";
import Scroll from "./Scroll";
const App = () => {
const initialTweets = [
{ body: "Body 1" },
{ body: "Body 2" },
{ body: "Body 3" },
{ body: "Body 4" },
{ body: "Body 5" },
{ body: "Body 6" },
{ body: "Body 7" },
{ body: "Body 8" },
{ body: "Body 9" },
{ body: "Body 10" }
];
return (
<div>
<h1>demo: react-infinite-scroll-component</h1>
<hr />
<Scroll tweets={initialTweets} />
</div>
);
};
export default App;
Scroll.jsx
import React, { useCallback, useState } from "react";
import InfiniteScroll from "react-infinite-scroll-component";
const Scroll = ({ tweets }) => {
const [allTweets, setAllTweets] = useState(tweets);
const [hasMore, setHasmore] = useState(true);
const [lastPosition, setLastPosition] = useState(0);
const perPage = 4;
const loadProducts = useCallback(() => {
setTimeout(() => {
setAllTweets((prev) => [...prev, ...prev]);
}, 2000);
setLastPosition(lastPosition + perPage);
}, []);
console.log(allTweets);
return (
<InfiniteScroll
dataLength={allTweets.length}
next={loadProducts}
hasMore={hasMore}
loader={<h4>Loading...</h4>}
>
<div className="flex flex-col">
{allTweets.map((value, index) => (
<div key={index} className="py-10 px-5">
{value.body}
</div>
))}
</div>
</InfiniteScroll>
);
};
export default Scroll;
您需要进行一些调整才能完全按照您的意愿行事,但这应该会为您指明正确的方向。
注意:要在 codesandbox 中查看这项工作,请缩小演示 window 以便您可以滚动或将更多对象添加到 initialTweets
数组中。此外,您可以在 project's homepage.