11<script lang="ts">
2- import { Prop , Component , Vue , ProvideReactive } from ' vue-property-decorator' ;
2+ import { Prop , Component , Watch , Vue , ProvideReactive } from ' vue-property-decorator' ;
33import {
44 getGridGapDefault ,
55 getColumnCountDefault ,
@@ -50,7 +50,9 @@ interface RenderData<P> {
5050 firstRenderedRowOffset: number | null ;
5151}
5252
53- @Component
53+ @Component ({
54+ name: ' VirtualGrid' ,
55+ })
5456export default class VirtualGrid <P > extends Vue {
5557 @Prop ({ required: true }) items: Item <P >[];
5658 @Prop ({ default : () => () => true }) updateFunction: () => Promise <boolean >;
@@ -62,6 +64,7 @@ export default class VirtualGrid<P> extends Vue {
6264 width : number ,
6365 columnWidth : number
6466 ) => number ;
67+ @Prop ({ default: null }) scrollElement: HTMLElement | null ;
6568 @Prop ({ default: 500 }) updateTriggerMargin: number ;
6669 @Prop ({ default: null }) loader: Vue .Component ;
6770 @Prop ({ default: false }) debug: boolean ;
@@ -99,12 +102,18 @@ export default class VirtualGrid<P> extends Vue {
99102 this .ref = this .$refs .virtualGrid as Element ;
100103 this .initiliazeGrid ();
101104 window .addEventListener (' resize' , this .resize );
102- window .addEventListener (' scroll' , this .scroll );
105+ ( this . scrollElement ?? window ) .addEventListener (' scroll' , this .scroll );
103106 }
104107
105108 beforeDestroy() {
106109 window .removeEventListener (' resize' , this .resize );
107- window .removeEventListener (' scroll' , this .scroll );
110+ (this .scrollElement ?? window ).removeEventListener (' scroll' , this .scroll );
111+ }
112+
113+ @Watch (' scrollElement' )
114+ onScrollElementChanged(scrollElement : HTMLElement | null , oldScrollElement : HTMLElement | null ) {
115+ (oldScrollElement ?? window ).removeEventListener (' scroll' , this .scroll );
116+ (scrollElement ?? window ).addEventListener (' scroll' , this .scroll );
108117 }
109118
110119 resize(): void {
@@ -394,6 +403,7 @@ export default class VirtualGrid<P> extends Vue {
394403 getElementOffset(element : Element ) {
395404 return window .scrollY + element .getBoundingClientRect ().top ;
396405 }
406+
397407}
398408 </script >
399409
@@ -424,6 +434,7 @@ export default class VirtualGrid<P> extends Vue {
424434 <div
425435 v-for =" item in renderData.cellsToRender"
426436 :key =" item.id"
437+ class =" grid-item-wrapper"
427438 :style =" {
428439 'height': `${item.height}px`,
429440 'grid-column-start': item.columnNumber,
0 commit comments