Skip to content

Commit 148db93

Browse files
fix(InfiniteScroll): replace refs with state-based deps (#2740)
1 parent 9f31167 commit 148db93

File tree

1 file changed

+23
-28
lines changed

1 file changed

+23
-28
lines changed

src/components/InfiniteScrollPaginator/InfiniteScroll.tsx

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { PropsWithChildren } from 'react';
2-
import React, { useEffect, useRef } from 'react';
2+
import React, { useEffect, useRef, useState } from 'react';
33
import type { PaginatorProps } from '../../types/types';
44
import { deprecationAndReplacementWarning } from '../../utils/deprecationWarning';
55
import { DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD } from '../../constants/limits';
@@ -59,7 +59,7 @@ export type InfiniteScrollProps = PaginatorProps & {
5959
export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) => {
6060
const {
6161
children,
62-
element = 'div',
62+
element: Component = 'div',
6363
hasMore,
6464
hasMoreNewer,
6565
hasNextPage,
@@ -83,13 +83,13 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
8383
const hasNextPageFlag = hasNextPage || hasMoreNewer;
8484
const hasPreviousPageFlag = hasPreviousPage || hasMore;
8585

86-
const scrollComponent = useRef<HTMLElement>(undefined);
86+
const [scrollComponent, setScrollComponent] = useState<HTMLElement | null>(null);
8787
const previousOffset = useRef<number | undefined>(undefined);
8888
const previousReverseOffset = useRef<number | undefined>(undefined);
8989

9090
const scrollListenerRef = useRef<() => void>(undefined);
9191
scrollListenerRef.current = () => {
92-
const element = scrollComponent.current;
92+
const element = scrollComponent;
9393

9494
if (!element || element.offsetParent === null) {
9595
return;
@@ -107,6 +107,7 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
107107
}
108108

109109
if (isLoading) return;
110+
110111
if (
111112
previousOffset.current === offset &&
112113
previousReverseOffset.current === reverseOffset
@@ -147,7 +148,8 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
147148
}, []);
148149

149150
useEffect(() => {
150-
const scrollElement = scrollComponent.current?.parentNode;
151+
const scrollElement = scrollComponent?.parentNode;
152+
151153
if (!scrollElement) return;
152154

153155
const scrollListener = () => scrollListenerRef.current?.();
@@ -160,32 +162,25 @@ export const InfiniteScroll = (props: PropsWithChildren<InfiniteScrollProps>) =>
160162
scrollElement.removeEventListener('scroll', scrollListener, useCapture);
161163
scrollElement.removeEventListener('resize', scrollListener, useCapture);
162164
};
163-
}, [initialLoad, useCapture]);
165+
}, [initialLoad, scrollComponent, useCapture]);
164166

165167
useEffect(() => {
166-
const scrollElement = scrollComponent.current?.parentNode;
167-
if (scrollElement) {
168-
scrollElement.addEventListener('wheel', mousewheelListener, { passive: false });
169-
}
170-
return () => {
171-
if (scrollElement) {
172-
scrollElement.removeEventListener('wheel', mousewheelListener, useCapture);
173-
}
174-
};
175-
}, [useCapture]);
168+
const scrollElement = scrollComponent?.parentNode;
176169

177-
const attributes = {
178-
...elementProps,
179-
ref: (element: HTMLElement) => {
180-
scrollComponent.current = element;
181-
},
182-
};
183-
184-
const childrenArray = [loader, children];
170+
if (!scrollElement) return;
185171

186-
if (head) {
187-
childrenArray.unshift(head);
188-
}
172+
scrollElement.addEventListener('wheel', mousewheelListener, { passive: false });
189173

190-
return React.createElement(element, attributes, childrenArray);
174+
return () => {
175+
scrollElement.removeEventListener('wheel', mousewheelListener, useCapture);
176+
};
177+
}, [scrollComponent, useCapture]);
178+
179+
return (
180+
<Component {...elementProps} ref={setScrollComponent}>
181+
{head}
182+
{loader}
183+
{children}
184+
</Component>
185+
);
191186
};

0 commit comments

Comments
 (0)