【发布时间】:2020-07-01 09:11:38
【问题描述】:
我正在使用React Infinite Scroller 来呈现帖子列表。
我的加载更多结果函数被调用了 3 次,因此结果更新了 3 次(可以通过 console.log 看到)
我用以下方式渲染帖子:
{results.map((result) => (
<Widget data={result} key={result.id} />
))}
这会更新前两次结果,但是当状态第三次更改时,它不会再渲染任何结果。
我的完整代码:
import React, { useState } from "react";
import InfiniteScroll from "react-infinite-scroller";
import LoadingIndicator from "./loading";
import { request } from "../communication";
const InfiniteResults = ({ endpoint, widget }) => {
let [results, setResults] = useState([]);
let [hasMoreResults, setHasMoreResults] = useState(true);
const Widget = widget;
function loadMoreResults(page) {
// prevent from making more requests while waiting for the other one to complete
setHasMoreResults(false);
request
.get(endpoint, {
offset: page * 10,
})
.then(function gotResults(response) {
const data = response.data;
const resultsCopy = results;
data.results.forEach(function saveResultToState(result) {
resultsCopy.push(result);
});
setResults(resultsCopy);
console.log(resultsCopy);
console.log(results);
if (!data.next) {
setHasMoreResults(false);
} else {
setHasMoreResults(true);
}
});
}
return (
<InfiniteScroll
pageStart={-1}
loadMore={loadMoreResults}
hasMore={hasMoreResults}
loader={<p key={0}>Loading...</p>}
>
{results.map((result) => {
console.log("rerender");
return <Widget data={result} key={result.id} />;
})}
</InfiniteScroll>
);
};
export default InfiniteResults;
【问题讨论】:
-
您没有正确更新状态:与其“复制”
results状态(实际上不会像那样复制),您应该调用setResults结果作为参数:setResults(prevResults => prevResults.concat(data.results));你能试试吗?
标签: javascript reactjs state use-state