From 9741f0ca8e2a239e3bb7a730aad76f533a1c1c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Fri, 31 Jul 2026 14:28:19 +0800 Subject: [PATCH] fix: retry key scroll after data update --- src/hooks/useScrollTo.tsx | 2 +- tests/scroll.test.js | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/hooks/useScrollTo.tsx b/src/hooks/useScrollTo.tsx index 592a670..d88a7ac 100644 --- a/src/hooks/useScrollTo.tsx +++ b/src/hooks/useScrollTo.tsx @@ -91,7 +91,7 @@ export default function useScrollTo( const offset = getOffset(rawOffset, { getSize, align: mergedAlign }); const height = containerRef.current.clientHeight; - let needCollectHeight = false; + let needCollectHeight = index < 0; let newTargetAlign: 'top' | 'bottom' | null = targetAlign; let targetTop: number | null = null; diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 0c1ea28..57ea5d5 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -208,17 +208,24 @@ describe('List.Scroll', () => { expect(container.querySelector('ul').scrollTop).toEqual(520); }); - it('refreshes key index when data changes', () => { + it('retries key scroll when data changes after layout', () => { const ref = React.createRef(); function Demo() { const [data, setData] = React.useState(genData(1)); + const [update, setUpdate] = React.useState(false); + + React.useLayoutEffect(() => { + if (update) { + setData(genData(100)); + } + }, [update]); return ( <>