@@ -105,10 +105,10 @@ export interface TableProps<T extends TableData = TableData> extends TableOption
105105 */
106106 overscan? : number
107107 /**
108- * Estimated size (in px) of each item
108+ * Estimated size (in px) of each item, or a function that returns the size for a given index
109109 * @defaultValue 65
110110 */
111- estimateSize? : number
111+ estimateSize? : number | (( index : number ) => number )
112112 })
113113 /**
114114 * The text to display when the table is empty.
@@ -418,7 +418,24 @@ const virtualizer = !!props.virtualize && useVirtualizer({
418418 return rows .value .length
419419 },
420420 getScrollElement : () => rootRef .value ?.$el ,
421- estimateSize : () => virtualizerProps .value .estimateSize
421+ estimateSize : (index : number ) => {
422+ const estimate = virtualizerProps .value .estimateSize
423+ return typeof estimate === ' function' ? estimate (index ) : estimate
424+ }
425+ })
426+
427+ const renderedSize = computed (() => {
428+ if (! virtualizer ) {
429+ return 0
430+ }
431+
432+ const virtualItems = virtualizer .value .getVirtualItems ()
433+ if (! virtualItems ?.length ) {
434+ return 0
435+ }
436+
437+ // Sum up the actual sizes of virtual items
438+ return virtualItems .reduce ((sum : number , item : any ) => sum + item .size , 0 )
422439})
423440
424441function valueUpdater<T extends Updater <any >>(updaterOrValue : T , ref : Ref ) {
@@ -611,7 +628,7 @@ defineExpose({
611628 data-slot =" tfoot"
612629 :class =" ui.tfoot({ class: [props.ui?.tfoot] })"
613630 :style =" virtualizer ? {
614- transform: `translateY(${virtualizer.getTotalSize() - virtualizer.getVirtualItems().length * virtualizerProps.estimateSize }px)`
631+ transform: `translateY(${virtualizer.getTotalSize() - renderedSize }px)`
615632 } : undefined"
616633 >
617634 <tr data-slot =" separator" :class =" ui.separator({ class: [props.ui?.separator] })" />
0 commit comments