diff --git a/src/VirtualTable.tsx b/src/VirtualTable.tsx index b8899bc..140db06 100644 --- a/src/VirtualTable.tsx +++ b/src/VirtualTable.tsx @@ -25,7 +25,6 @@ import SizeChecker from './SizeChecker'; import './base.css'; interface Args { - height: number; renderer: (data: Type, classes: string) => ReactNode; fetcher: DataSource; style?: Style; @@ -42,7 +41,7 @@ function calculatePageCount(pageHeight: number, itemHeight: number) { * * @component */ -export default function VirtualTable({ height, renderer, fetcher, style }: Args): JSX.Element { +export default function VirtualTable({ renderer, fetcher, style }: Args): JSX.Element { const ref = useRef(null); const invisible = useRef(null); const scrolldiv = useRef(null); @@ -94,7 +93,7 @@ export default function VirtualTable({ height, renderer, fetcher, style }: case Status.Loaded: if (itemHeight) { const offset = Math.floor(state.scrollTop / itemHeight); - const c = calculatePageCount(height, itemHeight); + const c = calculatePageCount(ref.current?.clientHeight, itemHeight); let data_pages: Pages = state.data ? state.data.pages : {}; const page_index = Math.floor(offset / c); for (let i = -1; i < 2; ++i) { @@ -126,6 +125,19 @@ export default function VirtualTable({ height, renderer, fetcher, style }: } }, [state]); + useEffect(() => { + const handler = () => { + dispatch({ + type: RESET, + }); + }; + + window.addEventListener('resize', handler); + return () => { + window.removeEventListener('resize', handler); + } + }, []); + // Effect to run on each render to make sure that the scrolltop of // the item container is up-to-date. useEffect(() => { @@ -135,18 +147,13 @@ export default function VirtualTable({ height, renderer, fetcher, style }: } }); - let scrollbarWidth = 0; - if (scrolldiv && scrolldiv.current) { - scrollbarWidth = scrolldiv.current.offsetWidth - scrolldiv.current.children[0].offsetWidth; - } - return ( <> dispatch({ type: INITIALIZED, })} fetcher={fetcher} renderer={renderer} /> - - + +
({ height, renderer, fetcher, style }: top: 0, left: 0, bottom: 0, - width: `calc(100% - ${scrollbarWidth}px)`, + width: `calc(100% - ${scrolldiv.current?.offsetWidth - scrolldiv.current?.children[0].offsetWidth}px)`, height: '100%', }} > @@ -164,7 +171,7 @@ export default function VirtualTable({ height, renderer, fetcher, style }:
= state.data?.totalCount ? 'auto' : 'y-scroll'} position-absolute`} style={{ padding: 0, top: 0, @@ -228,7 +235,6 @@ export default function VirtualTable({ height, renderer, fetcher, style }: } VirtualTable.propTypes = { - height: PropTypes.number.isRequired, renderer: PropTypes.func.isRequired, fetcher: PropTypes.object.isRequired, style: PropTypes.object, diff --git a/testApp/src/index.tsx b/testApp/src/index.tsx index 286c725..0b6d6c6 100644 --- a/testApp/src/index.tsx +++ b/testApp/src/index.tsx @@ -39,7 +39,7 @@ function App() { }} /> - + style={style} renderer={(i, classes) =>
{i !== undefined ? i : 'unknown'}
} - height={400} fetcher={new Fetcher()} />