Virtual React Example: Different Scroll Element (Hook)
You can use VirtualScroller.setContainer in case something is rendered before primary virtual scroller items. It may be also useful in window scroll scenario.
import { memo } from "react";
import {
useVirtual,
Subscription,
mapVisibleRange,
useSyncedStyles,
createListItemRef
} from "@af-utils/virtual-react";
import { VirtualScrollerEvent } from "@af-utils/virtual-core";
import type { ListItemProps } from "@af-utils/virtual-react";
import css from "./style.module.css";
const Item = memo<ListItemProps>(({ model, i }) => (
<div ref={createListItemRef(model, i)} className={css.item}>
row {i}
</div>
));
const DifferentScrollElementHook = () => {
const model = useVirtual({
itemCount: 5000
});
const [outerRef, innerRef] = useSyncedStyles(model);
return (
<div className={css.list} ref={el => model.setScroller(el)}>
<div className={css.offset1}>Some offset</div>
<div>
<div className={css.offset2}>Some offset 2</div>
<div ref={el => model.setContainer(el)}>
<div ref={outerRef}>
<div ref={innerRef}>
<Subscription
model={model}
events={[VirtualScrollerEvent.RANGE]}
>
{() =>
mapVisibleRange(model, i => (
<Item key={i} model={model} i={i} />
))
}
</Subscription>
</div>
</div>
</div>
</div>
</div>
);
};
export default DifferentScrollElementHook;