我正在努力寻找一种模式,适用于我正在使用的无限滚动组件作为参考。我正在使用react-intersection-observer
钩子。问题是,当inView
状态为true时,我的fetchData
函数被调用了两次。我已经尝试了很多解决方案,但似乎都不起作用。流程似乎是:
1.页面加载inView
为false。
1.用户滚动inView
变为真。
1.异步调用fetchData
,useEffect结束。
res
最终返回,setQueryData
最终更新状态。
1.这会触发useEffect
再次执行,但由于数据刚刚被设置,它还没有被呈现,并将inView
链接组件推到一边。
1.由于inView
仍然是true
,因此执行另一个fetchData
。
看起来我需要在useEffect
运行后立即使inView
为false,但不确定这是否可能或正确,任何建议都将非常感谢!
type LoadMoreState = {
data: QueryDatabaseResponse[];
nextCursor: string | undefined;
};
export function LoadMore({ cursor }: { cursor: string }) {
const { ref, inView } = useInView();
const [queryData, setQueryData] = useState<LoadMoreState>({
data: [],
nextCursor: cursor,
});
useEffect(() => {
const fetchData = async () => {
if (inView) {
try {
const res = await getGoodFirstIssues({
page_size: 10,
start_cursor: queryData.nextCursor,
});
setQueryData((prevData) => ({
data: prevData.data.concat(res),
nextCursor: res.next_cursor || undefined,
}));
} catch (error) {
console.log("There was an error fetching the data", error);
}
}
};
fetchData();
}, [inView, queryData]);
字符串
1条答案
按热度按时间aiazj4mn1#
问题是,由于
nextCursor
,您需要在useEffect
中包含queryData
,但它也会触发useEffect
,而inView
仍然是true
。将
next_cursor
存储在ref(nextCursorRef
)中,并将其从useEffect
的依赖项中删除:字符串
我还将进一步重构它,以防止在
inView
是false
时定义和调用fetchData
:型