Skip to content

Commit 407ea2c

Browse files
committed
fix: sync controlled scrollbar visibility
1 parent a573364 commit 407ea2c

2 files changed

Lines changed: 39 additions & 8 deletions

File tree

src/ScrollBar.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
7575
const [visible, setVisible] = React.useState(showScrollBar);
7676
const visibleTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
7777

78-
const delayHidden = () => {
78+
const delayHidden = useEvent(() => {
7979
if (showScrollBar === true || showScrollBar === false) return;
8080
clearTimeout(visibleTimeoutRef.current);
8181
setVisible(true);
8282
visibleTimeoutRef.current = setTimeout(() => {
8383
setVisible(false);
8484
}, 3000);
85-
};
85+
});
8686

8787
// ======================== Range =========================
8888
const enableScrollRange = scrollRange - containerSize || 0;
@@ -134,10 +134,7 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
134134
nextTop = pagePosition - rect.top - spinSize / 2;
135135
}
136136

137-
onScroll(
138-
getScrollOffsetByThumbTop(nextTop, enableScrollRange, enableOffsetRange),
139-
horizontal,
140-
);
137+
onScroll(getScrollOffsetByThumbTop(nextTop, enableScrollRange, enableOffsetRange), horizontal);
141138
};
142139

143140
const onContainerMouseDown: React.MouseEventHandler = (e) => {
@@ -255,11 +252,17 @@ const ScrollBar = React.forwardRef<ScrollBarRef, ScrollBarProps>((props, ref) =>
255252
}, [dragging]);
256253

257254
React.useEffect(() => {
258-
delayHidden();
255+
if (showScrollBar === true || showScrollBar === false) {
256+
clearTimeout(visibleTimeoutRef.current);
257+
setVisible(showScrollBar);
258+
} else {
259+
delayHidden();
260+
}
261+
259262
return () => {
260263
clearTimeout(visibleTimeoutRef.current);
261264
};
262-
}, [scrollOffset]);
265+
}, [scrollOffset, showScrollBar, delayHidden]);
263266

264267
// ====================== Imperative ======================
265268
React.useImperativeHandle(ref, () => ({

tests/scroll.test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,34 @@ describe('List.Scroll', () => {
409409
const scrollbarElement = container.querySelector('.rc-virtual-list-scrollbar-visible');
410410
expect(scrollbarElement).not.toBeNull();
411411
});
412+
413+
it('syncs scrollbar visibility when showScrollBar changes', () => {
414+
const props = {
415+
itemHeight: 20,
416+
height: 100,
417+
data: genData(100),
418+
showScrollBar: false,
419+
};
420+
const { container, rerender } = genList(props);
421+
const getScrollbar = () => container.querySelector('.rc-virtual-list-scrollbar-vertical');
422+
423+
expect(getScrollbar()).not.toHaveClass('rc-virtual-list-scrollbar-visible');
424+
425+
rerender(genNode({ ...props, showScrollBar: true }));
426+
expect(getScrollbar()).toHaveClass('rc-virtual-list-scrollbar-visible');
427+
428+
rerender(genNode(props));
429+
expect(getScrollbar()).not.toHaveClass('rc-virtual-list-scrollbar-visible');
430+
431+
rerender(genNode({ ...props, showScrollBar: 'optional' }));
432+
expect(getScrollbar()).toHaveClass('rc-virtual-list-scrollbar-visible');
433+
434+
act(() => {
435+
jest.advanceTimersByTime(3000);
436+
});
437+
expect(getScrollbar()).not.toHaveClass('rc-virtual-list-scrollbar-visible');
438+
});
439+
412440
describe('not show scrollbar when disabled virtual', () => {
413441
[
414442
{ name: '!virtual', props: { virtual: false } },

0 commit comments

Comments
 (0)