発生した事象
react-infinite-scrollerで無限スクロールを実装していると、
loadMoreが2度動いてしまい、表示するデータを格納するstateに重複データが格納されるという挙動に悩まされました。
対処法
こちらのIssueに対処法がありました。
-
データをFetch中かどうかを判定するstateを追加
const [isFetching, setIsFetching] = useState(false);
2. 追加したstateを判定条件に加える
```typescript
<InfiniteScroll
pageStart={0}
loadMore={fetchData}
hasMore={!isFetching && hasMoreTracks} // isFetchingを判定条件に追加
initialLoad={true}
loader={<div key={0}>Loading ...</div>}
useWindow={false}
>
{items}
</InfiniteScroll>
```
3. loadMoreに設定するデータ取得処理で`isFetching`のstateを操作
```typescript
const fetchData = async () => {
try {
setIsFetching(true);
{
/* データ取得処理 */
}
} finally {
setIsFetching(false);
}
};
まとめ
画面の一番下までスクロールした場合に、loadMoreが実行される機構なので、
初回のDOM生成時に誤作動を起こす可能性があるとのこと。
同じ問題にハマった人の助けになると嬉しいです。