From d0adf88009bb67b66972545f8bd26727b8c74bd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B3=E5=BB=B7=E5=AE=89?= <73953029+nrps9909@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:15:14 +0800 Subject: [PATCH] fix: refresh virtual rows when rowKey changes --- src/hooks/useItemKey.ts | 13 +++++++------ tests/listy.behavior.test.tsx | 30 ++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/hooks/useItemKey.ts b/src/hooks/useItemKey.ts index f3df1d4..496642b 100644 --- a/src/hooks/useItemKey.ts +++ b/src/hooks/useItemKey.ts @@ -1,11 +1,12 @@ -import type * as React from 'react'; -import { useEvent } from '@rc-component/util'; +import * as React from 'react'; import type { RowKey } from '../List'; export default function useItemKey(rowKey: RowKey) { - return useEvent((item: T, index: number): React.Key => - typeof rowKey === 'function' - ? rowKey(item, index) - : (item[rowKey] as React.Key), + return React.useCallback( + (item: T, index: number): React.Key => + typeof rowKey === 'function' + ? rowKey(item, index) + : (item[rowKey] as React.Key), + [rowKey], ); } diff --git a/tests/listy.behavior.test.tsx b/tests/listy.behavior.test.tsx index 548f3b4..ec58f11 100644 --- a/tests/listy.behavior.test.tsx +++ b/tests/listy.behavior.test.tsx @@ -131,6 +131,36 @@ describe('Listy behaviors', () => { expect(lastProps.data).toEqual([]); }); + it('updates virtual row keys when rowKey changes', () => { + const items = [{ id: 1, slug: 'first' }]; + const itemRender = (item: (typeof items)[number]) =>
{item.id}
; + const { rerender } = render( + , + ); + + expect(MockedVirtualList.__getLastProps().data[0].taggedKey).toBe('item:1'); + + rerender( + , + ); + + expect(MockedVirtualList.__getLastProps().data[0].taggedKey).toBe( + 'item:first', + ); + }); + it('wraps virtual items with item class', () => { const { container } = renderList();