GitHub

Original file line numberDiff line numberDiff line change

@@ -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
424441

function 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] })" />

Read the original on github.com ↗