Skip to content

Commit 4e08b80

Browse files
authored
fix:scrollOffsetFn not included in effect dependency list (TanStack#111)
* fix: wrap scrollOffsetFn with ref * feat: pass scroll event to scrollOffsetFn
1 parent 08920a8 commit 4e08b80

File tree

4 files changed

+17
-6
lines changed

4 files changed

+17
-6
lines changed

.eslintrc

+6
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,11 @@
66
},
77
"parserOptions": {
88
"sourceType": "module"
9+
},
10+
"rules": {
11+
"react-hooks/exhaustive-deps": [
12+
"warn",
13+
{ "additionalHooks": "(useIsomorphicLayoutEffect)" }
14+
]
915
}
1016
}

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ const {
281281
- `onScrollElement: React.useRef(DOMElement)`
282282
- Optional
283283
- Allows using a different element to bind the `onScroll` event to
284-
- `scrollOffsetFn: Function() => number`
284+
- `scrollOffsetFn: Function(event?: Event) => number`
285285
- Optional
286286
- This function, if passed, is called on scroll to get the scroll offest rather than using `parentRef`'s `width` or `height`
287287
- `keyExtractor: Function(index) => String | Integer`

src/index.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,21 @@ export function useVirtual({
7676
const [range, setRange] = React.useState({ start: 0, end: 0 })
7777

7878
const element = onScrollElement ? onScrollElement.current : parentRef.current
79+
80+
const scrollOffsetFnRef = React.useRef(scrollOffsetFn)
81+
scrollOffsetFnRef.current = scrollOffsetFn
82+
7983
useIsomorphicLayoutEffect(() => {
8084
if (!element) {
8185
return
8286
}
8387

84-
const onScroll = () => {
85-
const scrollOffset = scrollOffsetFn
86-
? scrollOffsetFn()
88+
const onScroll = event => {
89+
const scrollOffset = scrollOffsetFnRef.current
90+
? scrollOffsetFnRef.current(event)
8791
: element[scrollKey]
8892
latestRef.current.scrollOffset = scrollOffset
93+
8994
setRange(prevRange => calculateRange(latestRef.current, prevRange))
9095
}
9196

@@ -100,7 +105,7 @@ export function useVirtual({
100105
return () => {
101106
element.removeEventListener('scroll', onScroll)
102107
}
103-
}, [element, scrollKey, size /* required */, outerSize /* required */])
108+
}, [element, scrollKey, size, outerSize])
104109

105110
const virtualItems = React.useMemo(() => {
106111
const virtualItems = []

types/index.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ declare function useVirtual<T>(options: {
3636
}
3737
keyExtractor?: (index: number) => number | string
3838
onScrollElement?: React.RefObject<HTMLElement>
39-
scrollOffsetFn?: () => number
39+
scrollOffsetFn?: (event?: Event) => number
4040
}): {
4141
virtualItems: VirtualItem[]
4242
totalSize: number

0 commit comments

Comments
 (0)