From 98cdb2d0e1baccfbd8312260e0e9eaabb1136c56 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: Tue, 7 Jul 2026 16:25:44 +0800 Subject: [PATCH] fix: avoid stale scroll retry sync --- src/Table.tsx | 8 ++++---- tests/Table.spec.jsx | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/Table.tsx b/src/Table.tsx index c59c125e9..06ff4464e 100644 --- a/src/Table.tsx +++ b/src/Table.tsx @@ -465,11 +465,11 @@ const Table = ( // Delay to force scroll position if not sync // ref: https://github.com/ant-design/ant-design/issues/37179 - if (target.scrollLeft !== scrollLeft) { - setTimeout(() => { + setTimeout(() => { + if (target.scrollLeft !== scrollLeft) { target.scrollLeft = scrollLeft; - }, 0); - } + } + }, 0); } } diff --git a/tests/Table.spec.jsx b/tests/Table.spec.jsx index 155f83d67..c73b54761 100644 --- a/tests/Table.spec.jsx +++ b/tests/Table.spec.jsx @@ -1322,4 +1322,47 @@ describe('Table.Basic', () => { fireEvent.scroll(tableBody); expect(onScroll).toHaveBeenCalled(); }); + + it('does not retry stale scrollLeft sync', () => { + vi.useFakeTimers(); + + try { + const { container } = render( + createTable({ + scroll: { x: 100, y: 100 }, + }), + ); + + const tableHeader = container.querySelector('.rc-table-header'); + const tableBody = container.querySelector('.rc-table-body'); + let headerScrollLeft = 0; + let bodyScrollLeft = 0; + + Object.defineProperty(tableHeader, 'scrollLeft', { + get() { + return headerScrollLeft; + }, + set(value) { + headerScrollLeft = Math.trunc(value); + }, + }); + Object.defineProperty(tableBody, 'scrollLeft', { + get() { + return bodyScrollLeft; + }, + }); + + bodyScrollLeft = 794.171875; + fireEvent.scroll(tableBody); + + bodyScrollLeft = 0; + fireEvent.scroll(tableBody); + + vi.runAllTimers(); + + expect(headerScrollLeft).toBe(0); + } finally { + vi.useRealTimers(); + } + }); });