Skip to content

Commit 92f8a3c

Browse files
authored
fix(VDataTable): avoid lags when selecting rows in large tables (#22163)
reverts #21829 fixes #21767
1 parent e075886 commit 92f8a3c

File tree

5 files changed

+47
-47
lines changed

5 files changed

+47
-47
lines changed

packages/vuetify/src/components/VDataTable/VDataTableGroupHeaderRow.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { VCheckboxBtn } from '@/components/VCheckbox'
77
import { useGroupBy } from './composables/group'
88
import { useHeaders } from './composables/headers'
99
import { useSelection } from './composables/select'
10+
import { makeDensityProps } from '@/composables/density'
1011
import { IconValue } from '@/composables/icons'
1112

1213
// Utilities
@@ -35,6 +36,7 @@ export const makeVDataTableGroupHeaderRowProps = propsFactory({
3536
type: IconValue,
3637
default: '$tableGroupExpand',
3738
},
39+
...makeDensityProps(),
3840
}, 'VDataTableGroupHeaderRow')
3941

4042
export const VDataTableGroupHeaderRow = genericComponent<VDataTableGroupHeaderRowSlots>()({
@@ -87,6 +89,7 @@ export const VDataTableGroupHeaderRow = genericComponent<VDataTableGroupHeaderRo
8789
return slots['data-table-select']?.({ props: { modelValue, indeterminate, 'onUpdate:modelValue': selectGroup } }) ?? (
8890
<VDataTableColumn class="v-data-table__td--select-row" noPadding>
8991
<VCheckboxBtn
92+
density={ props.density }
9093
modelValue={ modelValue }
9194
indeterminate={ indeterminate }
9295
onUpdate:modelValue={ selectGroup }

packages/vuetify/src/components/VDataTable/VDataTableHeaders.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { useHeaders } from './composables/headers'
1010
import { useSelection } from './composables/select'
1111
import { useSort } from './composables/sort'
1212
import { useBackgroundColor } from '@/composables/color'
13+
import { makeDensityProps } from '@/composables/density'
1314
import { makeDisplayProps, useDisplay } from '@/composables/display'
1415
import { IconValue } from '@/composables/icons'
1516
import { LoaderSlot, makeLoaderProps, useLoader } from '@/composables/loader'
@@ -77,6 +78,7 @@ export const makeVDataTableHeadersProps = propsFactory({
7778
/** @deprecated */
7879
sticky: Boolean,
7980

81+
...makeDensityProps(),
8082
...makeDisplayProps(),
8183
...makeLoaderProps(),
8284
}, 'VDataTableHeaders')
@@ -202,6 +204,7 @@ export const VDataTableHeaders = genericComponent<VDataTableHeadersSlots>()({
202204
if (column.key === 'data-table-select') {
203205
return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && (
204206
<VCheckboxBtn
207+
density={ props.density }
205208
modelValue={ allSelected.value }
206209
indeterminate={ someSelected.value && !allSelected.value }
207210
onUpdate:modelValue={ selectAll }

packages/vuetify/src/components/VDataTable/VDataTableRow.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useExpanded } from './composables/expand'
88
import { useHeaders } from './composables/headers'
99
import { useSelection } from './composables/select'
1010
import { useSort } from './composables/sort'
11+
import { makeDensityProps } from '@/composables/density'
1112
import { makeDisplayProps, useDisplay } from '@/composables/display'
1213
import { IconValue } from '@/composables/icons'
1314

@@ -52,6 +53,7 @@ export const makeVDataTableRowProps = propsFactory({
5253
onContextmenu: EventProp<[MouseEvent]>(),
5354
onDblclick: EventProp<[MouseEvent]>(),
5455

56+
...makeDensityProps(),
5557
...makeDisplayProps(),
5658
}, 'VDataTableRow')
5759

@@ -168,6 +170,7 @@ export const VDataTableRow = genericComponent<new <T>(
168170
}) ?? (
169171
<VCheckboxBtn
170172
disabled={ !item.selectable }
173+
density={ props.density }
171174
modelValue={ isSelected([item]) }
172175
onClick={ withModifiers(
173176
(event: Event) => toggleSelect(item, props.index, event as PointerEvent),

packages/vuetify/src/components/VDataTable/VDataTableRows.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ export const makeVDataTableRowsProps = propsFactory({
4949
rowProps: [Object, Function] as PropType<RowProps<any>>,
5050
cellProps: [Object, Function] as PropType<CellProps<any>>,
5151

52-
...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon']),
53-
...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon']),
52+
...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon', 'density']),
53+
...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon', 'density']),
5454
...makeDisplayProps(),
5555
}, 'VDataTableRows')
5656

@@ -75,7 +75,7 @@ export const VDataTableRows = genericComponent<new <T>(
7575
const { mobile } = useDisplay(props)
7676

7777
useRender(() => {
78-
const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon'])
78+
const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon', 'density'])
7979

8080
if (props.loading && (!props.items.length || slots.loading)) {
8181
return (
@@ -165,6 +165,7 @@ export const VDataTableRows = genericComponent<new <T>(
165165
cellProps: props.cellProps,
166166
collapseIcon: props.collapseIcon,
167167
expandIcon: props.expandIcon,
168+
density: props.density,
168169
mobile: mobile.value,
169170
},
170171
getPrefixedEventHandlers(attrs, ':row', () => slotProps),

packages/vuetify/src/components/VTable/VTable.tsx

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { convertToUnit, genericComponent, propsFactory, useRender } from '@/util
1212

1313
// Types
1414
import type { PropType } from 'vue'
15-
import { VDefaultsProvider } from '../VDefaultsProvider'
1615

1716
export type VTableSlots = {
1817
default: never
@@ -49,51 +48,42 @@ export const VTable = genericComponent<VTableSlots>()({
4948
const { themeClasses } = provideTheme(props)
5049
const { densityClasses } = useDensity(props)
5150

52-
useRender(() => {
53-
const tableContentDefaults = {
54-
VCheckboxBtn: {
55-
density: props.density,
56-
},
57-
}
51+
useRender(() => (
52+
<props.tag
53+
class={[
54+
'v-table',
55+
{
56+
'v-table--fixed-height': !!props.height,
57+
'v-table--fixed-header': props.fixedHeader,
58+
'v-table--fixed-footer': props.fixedFooter,
59+
'v-table--has-top': !!slots.top,
60+
'v-table--has-bottom': !!slots.bottom,
61+
'v-table--hover': props.hover,
62+
'v-table--striped-even': props.striped === 'even',
63+
'v-table--striped-odd': props.striped === 'odd',
64+
},
65+
themeClasses.value,
66+
densityClasses.value,
67+
props.class,
68+
]}
69+
style={ props.style }
70+
>
71+
{ slots.top?.() }
5872

59-
return (
60-
<props.tag
61-
class={[
62-
'v-table',
63-
{
64-
'v-table--fixed-height': !!props.height,
65-
'v-table--fixed-header': props.fixedHeader,
66-
'v-table--fixed-footer': props.fixedFooter,
67-
'v-table--has-top': !!slots.top,
68-
'v-table--has-bottom': !!slots.bottom,
69-
'v-table--hover': props.hover,
70-
'v-table--striped-even': props.striped === 'even',
71-
'v-table--striped-odd': props.striped === 'odd',
72-
},
73-
themeClasses.value,
74-
densityClasses.value,
75-
props.class,
76-
]}
77-
style={ props.style }
78-
>
79-
{ slots.top?.() }
80-
<VDefaultsProvider defaults={ tableContentDefaults }>
81-
{ slots.default ? (
82-
<div
83-
class="v-table__wrapper"
84-
style={{ height: convertToUnit(props.height) }}
85-
>
86-
<table>
87-
{ slots.default() }
88-
</table>
89-
</div>
90-
) : slots.wrapper?.()}
91-
</VDefaultsProvider>
73+
{ slots.default ? (
74+
<div
75+
class="v-table__wrapper"
76+
style={{ height: convertToUnit(props.height) }}
77+
>
78+
<table>
79+
{ slots.default() }
80+
</table>
81+
</div>
82+
) : slots.wrapper?.()}
9283

93-
{ slots.bottom?.() }
94-
</props.tag>
95-
)
96-
})
84+
{ slots.bottom?.() }
85+
</props.tag>
86+
))
9787

9888
return {}
9989
},

0 commit comments

Comments
 (0)