11import * as React from 'react' ;
2- import { useRef , useState } from 'react' ;
2+ import { useRef , useState , useLayoutEffect } from 'react' ;
33import classNames from 'classnames' ;
44import Filler from './Filler' ;
55import ScrollBar from './ScrollBar' ;
@@ -50,6 +50,8 @@ export interface ListProps<T> extends React.HTMLAttributes<any> {
5050 virtual ?: boolean ;
5151
5252 onScroll ?: React . UIEventHandler < HTMLElement > ;
53+ /** Trigger when render list item changed */
54+ onVisibleChange ?: ( visibleList : T [ ] , fullList : T [ ] ) => void ;
5355}
5456
5557export function RawList < T > ( props : ListProps < T > , ref : React . Ref < ListRef > ) {
@@ -66,6 +68,7 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
6668 virtual,
6769 component : Component = 'div' ,
6870 onScroll,
71+ onVisibleChange,
6972 ...restProps
7073 } = props ;
7174
@@ -99,7 +102,7 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
99102
100103 // ================================ Scroll ================================
101104 function syncScrollTop ( newTop : number | ( ( prev : number ) => number ) ) {
102- setScrollTop ( origin => {
105+ setScrollTop ( ( origin ) => {
103106 let value : number ;
104107 if ( typeof newTop === 'function' ) {
105108 value = newTop ( origin ) ;
@@ -242,8 +245,8 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
242245 useVirtual ,
243246 isScrollAtTop ,
244247 isScrollAtBottom ,
245- offsetY => {
246- syncScrollTop ( top => {
248+ ( offsetY ) => {
249+ syncScrollTop ( ( top ) => {
247250 const newTop = top + offsetY ;
248251 return newTop ;
249252 } ) ;
@@ -260,7 +263,7 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
260263 return true ;
261264 } ) ;
262265
263- React . useLayoutEffect ( ( ) => {
266+ useLayoutEffect ( ( ) => {
264267 // Firefox only
265268 function onMozMousePixelScroll ( e : Event ) {
266269 if ( useVirtual ) {
@@ -297,6 +300,14 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
297300 scrollTo,
298301 } ) ) ;
299302
303+ // ================================ Effect ================================
304+ /** We need told outside that some list not rendered */
305+ useLayoutEffect ( ( ) => {
306+ const renderList = mergedData . slice ( start , end ) ;
307+
308+ onVisibleChange ?.( renderList , mergedData ) ;
309+ } , [ start , end , mergedData ] ) ;
310+
300311 // ================================ Render ================================
301312 const listChildren = useChildren ( mergedData , start , end , setInstanceRef , children , sharedConfig ) ;
302313
0 commit comments