diff --git a/src/List.tsx b/src/List.tsx index ece1ccb..63816da 100644 --- a/src/List.tsx +++ b/src/List.tsx @@ -1,8 +1,7 @@ import { clsx } from 'clsx'; import type { ResizeObserverProps } from '@rc-component/resize-observer'; import ResizeObserver from '@rc-component/resize-observer'; -import { useEvent } from '@rc-component/util'; -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; +import { useEvent, useLayoutEffect } from '@rc-component/util'; import * as React from 'react'; import { useRef, useState } from 'react'; import { flushSync } from 'react-dom'; @@ -558,6 +557,7 @@ export function RawList(props: ListProps, ref: React.Ref) { end, virtual: inVirtual, offsetX: offsetLeft, + scrollTop: offsetTop, offsetY: fillerOffset, rtl: isRTL, getSize, diff --git a/src/ScrollBar.tsx b/src/ScrollBar.tsx index d8a4148..ce4ff6f 100644 --- a/src/ScrollBar.tsx +++ b/src/ScrollBar.tsx @@ -1,5 +1,5 @@ import { clsx } from 'clsx'; -import raf from '@rc-component/util/lib/raf'; +import { raf } from '@rc-component/util'; import * as React from 'react'; import { getPageXY } from './hooks/useScrollDrag'; diff --git a/src/hooks/useFrameWheel.ts b/src/hooks/useFrameWheel.ts index 7dea2ef..901a39a 100644 --- a/src/hooks/useFrameWheel.ts +++ b/src/hooks/useFrameWheel.ts @@ -1,4 +1,4 @@ -import raf from '@rc-component/util/lib/raf'; +import { raf } from '@rc-component/util'; import { useRef } from 'react'; import isFF from '../utils/isFirefox'; import useOriginScroll from './useOriginScroll'; diff --git a/src/hooks/useMobileTouchMove.ts b/src/hooks/useMobileTouchMove.ts index 3a787f8..cd3dc36 100644 --- a/src/hooks/useMobileTouchMove.ts +++ b/src/hooks/useMobileTouchMove.ts @@ -1,4 +1,4 @@ -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; +import { useLayoutEffect } from '@rc-component/util'; import type * as React from 'react'; import { useRef } from 'react'; diff --git a/src/hooks/useScrollDrag.ts b/src/hooks/useScrollDrag.ts index fd7c701..08510c5 100644 --- a/src/hooks/useScrollDrag.ts +++ b/src/hooks/useScrollDrag.ts @@ -1,4 +1,4 @@ -import raf from '@rc-component/util/lib/raf'; +import { raf } from '@rc-component/util'; import * as React from 'react'; function smoothScrollOffset(offset: number) { diff --git a/src/hooks/useScrollTo.tsx b/src/hooks/useScrollTo.tsx index 54d2ae9..3dd8518 100644 --- a/src/hooks/useScrollTo.tsx +++ b/src/hooks/useScrollTo.tsx @@ -1,10 +1,8 @@ /* eslint-disable no-param-reassign */ import * as React from 'react'; -import raf from '@rc-component/util/lib/raf'; +import { raf, useLayoutEffect, warning } from '@rc-component/util'; import type { GetKey } from '../interface'; import type CacheMap from '../utils/CacheMap'; -import useLayoutEffect from '@rc-component/util/lib/hooks/useLayoutEffect'; -import { warning } from '@rc-component/util'; const MAX_TIMES = 10; diff --git a/src/index.ts b/src/index.ts index a312aa0..bbcd8f3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ import List from './List'; -export type { ListRef, ListProps } from './List'; +export type { ListRef, ListProps, ScrollConfig, ScrollTo } from './List'; +export { default as MockList } from './mock'; export default List; diff --git a/src/interface.ts b/src/interface.ts index e0fd765..a7c4628 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -19,8 +19,20 @@ export interface ExtraRenderInfo { end: number; /** Is current in virtual render */ virtual: boolean; - /** Used for `scrollWidth` tell the horizontal offset */ + /** + * Horizontal scroll offset applied to rendered items when `scrollWidth` is set. + * 当设置 `scrollWidth` 时,应用到已渲染元素上的横向滚动偏移量。 + */ offsetX: number; + /** + * Current vertical scrollTop of the holder element. + * holder 元素当前真实的纵向 `scrollTop`,表示视口滚动到了哪里。 + */ + scrollTop: number; + /** + * Vertical translate offset of the rendered filler content. + * 已渲染 filler 内容的纵向 `translateY` 偏移量,表示这一段内容被平移到虚拟列表中的哪个位置。 + */ offsetY: number; rtl: boolean; diff --git a/tests/scroll.test.js b/tests/scroll.test.js index 7eba007..5423ab3 100644 --- a/tests/scroll.test.js +++ b/tests/scroll.test.js @@ -113,6 +113,30 @@ describe('List.Scroll', () => { wrapper.unmount(); }); + + it('passes current scrollTop to extraRender', () => { + const listRef = React.createRef(); + const extraRender = jest.fn(() => null); + const wrapper = genList({ + itemHeight: 20, + height: 100, + data: genData(100), + ref: listRef, + extraRender, + }); + + listRef.current.scrollTo(80); + jest.runAllTimers(); + wrapper.update(); + + expect(extraRender).toHaveBeenLastCalledWith( + expect.objectContaining({ + scrollTop: 80, + }), + ); + + wrapper.unmount(); + }); }); describe('scroll to object', () => {