【发布时间】:2023-02-04 04:10:09
【问题描述】:
大家好,我在尝试对 div 元素使用 Ref 时遇到了一个奇怪而烦人的问题。我的工作与在另一页上完全一样,但这似乎并没有按照我在该页面上的要求进行。
我正在尝试实现无尽的滚动。目标是将 ref (refetchTrigger) 附加到页面上的某个 div,并在滚动到视图中时触发对下一页数据的提取。它似乎正确地呈现了 div,但 refetchTrigger 没有更新为 div,它只是保持为空。似乎这里需要重新渲染,但显然更改 refs 不会触发重新渲染。我整个上午都在为此苦苦挣扎,非常感谢任何建议。在下面的代码 sn-p 中,所有 console.log(refetchTrigger.current) 都打印出 null。
还值得注意的是,refetch 调用使用 useSWR 挂钩来获取数据。删除它时,将 ref 附加到 div 似乎可以正常工作。此外,在添加按钮以按预期获取其获取时。它只是在尝试自动触发我看到问题的提取时尝试。
谢谢您的帮助!
export const TrackGrid = () => {
const [list, setList] = useState<Track[]>([]);
const [page, setPage] = useState<number>(1);
const refetchTrigger = useRef<HTMLDivElement | null>(null);
const inViewport = useIntersection(refetchTrigger, "0px");
const { tracks, error, isValidating } = useGetTracks(false, page, 20);
useEffect(() => {
if (inViewport) {
setPage(page + 1);
}
console.log("in viewport");
}, [inViewport]);
useEffect(() => {
if (tracks) setList([...list, ...tracks]);
}, [tracks]);
const renderDiv = () => {
console.log(refetchTrigger.current);
const d = <div ref={refetchTrigger}>exists</div>;
console.log(refetchTrigger.current);
return d;
};
return (
<>
<div className="grid place-items-center grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4">
{!!list.length && renderDiv()}
{list.map((track: Track, i: number) => {
console.log(refetchTrigger.current);
return (
<div ref={refetchTrigger} key={i}>
<TrackGridItem track={track} />
</div>
);
})}
</div>
</>
);
};
【问题讨论】:
标签: reactjs dom infinite-scroll use-ref swr