Tabla virtualizada beta
Along with evolutionary web development, table component has always been the most popular component in our web apps especially for dashboards, data analysis. For Table V1, with even just 1000 records of data, it can be very annoying when using it, because of the poor performance.
Con la Tabla Virtualizada, puede renderizar masivos trozos de datos en un parpadeo de ojos.
TIP
Este componente todavía está bajo prueba, úselo bajo su propio riesgo. If you find any bugs or issues, please report them at GitHub for us to fix. Also there were some APIs which are not mentioned in this documentation, some of them were not fully developed yet, which is why they are not mentioned here.
Even though Virtualized Table is efficient, when the data load is too large, your network and memory size can become the bottleneck of your app. So keep in mind that Virtualized Table is never the ultimate solution for everything, consider paginating your data, adding filters etc.
Uso básico
Let's demonstrate the performance of the Virtualized Table by rendering a basic example with 10 columns and 1000 rows.
Auto redimensionar
When you do not want to manually pass the width
and height
properties to the table, you can wrap the table component with the AutoResizer. This will automatically update the width and height for you.
Redimensione su navegador para ver cómo funciona.
TIP
Make sure the parent node of the AutoResizer
HAS A FIXED HEIGHT, since its default height value is set to 100%. Alternatively, you can define it by passing the style
attribute to AutoResizer
.
Personalizar el procesador de celdas
Of course, you can render the table cell according to your needs. Here's a simple example of how to customize your cell.
Tabla con selecciones
Utilizando el renderizador de celdas personalizado para permitir la selección para la tabla.
Edición en línea
Just as we demonstrated with selections above, you can use the same method to enable inline editing.
Tabla con estado
Puede destacar su contenido de tabla para distinguir entre "success, information, warning, danger" y otros estados.
To customize the appearance of rows, use the row-class-name
attribute. For example, every 10th row is highlighted using the bg-blue-200
class, and every 5th row with the bg-red-100
class.
Tabla con filas pegajosas
You can make some rows stick to the top of the table, and that can be very easily achieved by using the fixed-data
attribute.
You can dynamically set the sticky row based on scroll events, as shown in this example.
Tabla con columnas fijas
If you want to have columns stick to the left or right for some reason, you can achieve this by adding special attributes to the table.
Puede establecer el atributo de la columna fixed
a true
(representando con FixedDir.LEFT
) o FixedDir.LEFT
o FixedDir.RIGHT
Encabezado de grupo
By customizing your header renderer, you can group your header as shown in this example.
TIP
In this case we used JSX
feature which is not supported in the playground. You may try them out in your local environment or on online IDEs such as codesandbox
.
Se recomienda que escriba el componente de tabla en JSX, ya que contiene manipulaciones de VNode.
Filtros
Virtualized Table provides custom header renderers for creating customized headers. We can then utilize these to render filters.
Ordenable
Puede ordenar la tabla con el estado de ordenación.
Orden controlado
You can define multiple sortable columns as needed. Keep in mind that if you define multiple sortable columns, the UI may appear confusing to your users, as it becomes unclear which column is currently being sorted.
Intervalo cruzado
When dealing with a large list, it's easy to lose track of the current row and column you are visiting. In such cases, using this feature can be very helpful.
Colspan
The virtualized table doesn't use the built-in table
element, so colspan
and rowspan
behave a bit differently compared to TableV1. However, with a customized row renderer, these features can still be implemented. In this section, we'll demonstrate how to achieve this.
Rowspan
Since we have covered Colspan, it's worth noting that we also have row span. It's a little bit different from colspan but the idea is basically the same.
Rowspan y Colspan juntos
¡Podemos combinar rowspan y colspan para alcanzar el objetivo de negocio!
Datos con formato de árbol
Virtual Table can also render data in a tree-like structure. By clicking the arrow icon, you can expand or collapse the tree nodes.
Filas de altura dinámica
Virtual Table is capable of rendering rows with dynamic heights. If you're working with data and are uncertain about the content size, this feature is ideal for rendering rows that adjust to the content's height. To enable this, pass down the estimated-row-height
attribute. The closer the estimated height matches the actual content, the smoother the rendering experience.
TIP
Each row's height is dynamically measured during rendering the rows. As a result, if you're trying to display a large amount of data, the UI might be bouncing.
Vista de detalle
Using dynamic height rendering, you can also display a detailed view within the table.
Pie personalizado
Render a customized footer when you want to show a concluding message or information.
Renderizado personalizado de vacío
Render a customized empty element.
Overlay
Render an overlay on top of the table when you want to show a loading indicator or something else.
Desplazamiento manual
Use the methods provided by Table V2 to scroll manually/programmatically with desired offset/rows.
TIP
El segundo parámetro para scrollToRow
es la estrategia de desplazamiento que por defecto es auto
, calcula la posición para desplazarse por sí misma. If you wish to scroll to a specific position, you can define the strategy yourself. Las opciones disponibles son "auto" | "center" | "end" | "start" | "smart"
La diferencia entre smart
y auto
es que auto
es un subconjunto de la estrategia de desplazamiento smart
.
Atributos de TableV2
Nombre | Descripción | Tipo | Por defecto |
---|---|---|---|
cache | Number of rows rendered in advance to boost the performance | Number | 2 |
estimated-row-height | La altura estimada de fila para renderizar filas de altura dinámica | Number | — |
header-class | Nombre de clase personalizado pasado al envoltorio de cabecera | String/Function<HeaderClassGetter> | — |
header-props | Nombre de las propiedades personalizadas pasadas al componente de cabecera | Object/Function<HeaderPropsGetter> | — |
header-cell-props | Nombre de las propiedades personalizadas pasadas al componente de celdas de la cabecera | Object/Function<HeaderCellPropsGetter> | — |
header-height | The height of the header is set by height . If given an array, it renders header rows equal to its length | Number/Array<Number> | 50 |
footer-height | The height of the footer element, when provided, will be part to the calculation of the table's height. | Number | 0 |
row-class | Nombre de clase personalizado pasado al envoltorio de fila | String/Function<RowClassGetter> | — |
row-key | The key of each row, if not provided, will be the index of the row | String/Symbol/Number | id |
row-props | Nombre de las propiedades personalizadas pasadas al componente de fila | Object/Function<RowPropsGetter> | — |
row-height | La altura de cada fila, utilizada para calcular la altura total de la tabla | Number | 50 |
cell-props | propiedades adicionales pasados a cada célula (excepto las células de la cabecera) | Object/Function<CellPropsGetter> | — |
columns | Un array de definiciones de columnas. | Array<Column> | — |
data | Una matriz de datos a procesar en la tabla. | Array<Data> | [] |
data-getter | A method to customize data fetch from the data source. | Function | — |
fixed-data | Datos para procesar filas sobre el contenido principal y debajo del encabezado | Array<Data> | — |
expand-column-key | La clave de columna que indica qué fila se puede expandir | String | — |
expanded-row-keys | Un array de claves para filas expandidas, puede utilizarse con v-model | Array<KeyType> | — |
default-expanded-row-keys | Un array de claves para filas expandidas por defecto, NO REACTIVE | Array<KeyType> | — |
class | Class name for the virtual table, will be applied to all three tables (left, right, main) | String/Array/Object | — |
fixed | Flag indicates the table column's width to be fixed or flexible. | Boolean | false |
width required | Width of the table | Number | — |
height required | Height of the table | Number | — |
max-height | Maximum height of the table | Number | — |
h-scrollbar-size | Indica el tamaño de la barra de desplazamiento horizontal para la tabla, utilizada para prevenir el colapso de la barra de desplazamiento horizontal y vertical | Number | 6 |
v-scrollbar-size | Indica el tamaño de la barra de desplazamiento vertical para la tabla, utilizada para prevenir el colapso de la barra de desplazamiento horizontal y vertical | Number | 6 |
scrollbar-always-on | Si se activa, la barra de desplazamiento siempre se mostrará en lugar de cuando el ratón se coloca encima de la tabla | Boolean | false |
sort-by | Indicador de orden | Object<SortBy> | {} |
sort-state | Múltiples indicadores de ordenación | Object<SortState> | undefined |
Slots de TableV2
Nombre | Parámetros |
---|---|
cell | CellSlotProps |
header | HeaderSlotProps |
header-cell | HeaderCellSlotProps |
row | RowSlotProps |
footer | — |
empty | — |
overlay | — |
Eventos de TableV2
Nombre | Descripción | Parámetros |
---|---|---|
column-sort | Se invoca cuando la columna está ordenada | Object<ColumnSortParam> |
expanded-rows-change | Invocado cuando las filas expandidas cambian | Array<KeyType> |
end-reached | Invocado cuando se alcanza el final de la tabla | — |
scroll | Invoked after scrolling | Object<ScrollParams> |
rows-rendered | Invocado cuando las filas son procesadas | Object<RowsRenderedParams> |
row-expand | Se invoca cuando se expande/contrae el nodo del árbol haciendo clic en el icono de la flecha | Object<RowExpandParams> |
row-event-handlers | Una colección de manejadores conectados a cada fila | Object<RowEventHandlers> |
Métodos TableV2
Nombre | Descripción | Parámetros |
---|---|---|
scrollTo | Desplazar a una posición determinada | { scrollLeft?: number, scrollTop?: number} |
scrollToLeft | Desplazar a una posición horizontal determinada | scrollLeft: number |
scrollToTop | Desplazar a una posición vertical dada | scrollTop: number |
scrollToRow | desplazar a una fila determinada con la estrategia de desplazamiento especificada | row: number, strategy?: "auto" |"center" | "end" | "start" | "smart" |
TIP
Note that these are JavaScript
Objects, so you CANNOT USE kebab-case for these attributes
Atributos de columna
Nombre | Descripción | Tipo | Por defecto |
---|---|---|---|
align | Alineación del contenido de la celda | Alignment | left |
class | Nombre de la clase para la columna | String | — |
key | Unique identification | KeyType | — |
dataKey | Unique identification of data | KeyType | — |
fixed | Dirección fija de la columna | Boolean/FixedDir | false |
flexGrow | CSSProperties flex grow, Only useful when this is not a fixed table | Number | 0 |
flexShrink | CSSProperties flex shrink, Only useful when this is not a fixed table | Number | 1 |
headerClass | Utilizado para personalizar la clase de columna de cabecera | String | — |
hidden | Si la columna es invisible | Boolean | — |
style | Estilo personalizado para la celda de columna, se fusionará con celda de cuadrícula | CSSProperties | — |
sortable | Indica si la columna es ordenable | Boolean | — |
title | El texto por defecto renderizado en la celda de cabecera | String | — |
maxWidth | Ancho máximo para la columna | Number | — |
minWidth | Ancho mínimo para la columna | Number | — |
width required | Width for the column | Number | — |
cellRenderer | Renderizado personalizado de celdas | VueComponent/(props: CellRenderProps) => VNode | — |
headerCellRenderer | Renderizado personalizado de cabecera | VueComponent/(props: HeaderRenderProps) => VNode | — |
Typings
Mostrar Declaraciones de Tipo
type HeaderClassGetter = (param: {
columns: Column<any>[]
headerIndex: number
}) => string
type HeaderPropsGetter = (param: {
columns: Column<any>[]
headerIndex: number
}) => Record<string, any>
type HeaderCellPropsGetter = (param: {
columns: Column<any>[]
column: Column<any>
columnIndex: number
headerIndex: number
style: CSSProperties
}) => Record<string, any>
type RowClassGetter = (param: {
columns: Column<any>[]
rowData: any
rowIndex: number
}) => string
type RowPropsGetter = (param: {
columns: Column<any>[]
rowData: any
rowIndex: number
}) => Record<string, any>
type CellPropsGetter = (param: {
column: Column<any>
columns: Column<any>[]
columnIndex: number
cellData: any
rowData: any
rowIndex: number
}) => void
type CellRenderProps<T> = {
cellData: T
column: Column<T>
columns: Column<T>[]
columnIndex: number
rowData: any
rowIndex: number
}
type HeaderRenderProps<T> = {
column: Column<T>
columns: Column<T>[]
columnIndex: number
headerIndex: number
}
type ScrollParams = {
xAxisScrollDir: 'forward' | 'backward'
scrollLeft: number
yAxisScrollDir: 'forward' | 'backward'
scrollTop: number
}
type CellSlotProps<T> = {
column: Column<T>
columns: Column<T>[]
columnIndex: number
depth: number
style: CSSProperties
rowData: any
rowIndex: number
isScrolling: boolean
expandIconProps?:
| {
rowData: any
rowIndex: number
onExpand: (expand: boolean) => void
}
| undefined
}
type HeaderSlotProps = {
cells: VNode[]
columns: Column<any>[]
headerIndex: number
}
type HeaderCellSlotProps = {
class: string
columns: Column<any>[]
column: Column<any>
columnIndex: number
headerIndex: number
style: CSSProperties
headerCellProps?: any
sortBy: SortBy
sortState?: SortState | undefined
onColumnSorted: (e: MouseEvent) => void
}
type RowCommonParams = {
rowData: any
rowIndex: number
}
type RowEventHandlerParams = {
rowKey: KeyType
event: Event
} & RowCommonParams
type RowEventHandler = (params: RowEventHandlerParams) => void
type RowEventHandlers = {
onClick?: RowEventHandler
onContextmenu?: RowEventHandler
onDblclick?: RowEventHandler
onMouseenter?: RowEventHandler
onMouseleave?: RowEventHandler
}
type RowsRenderedParams = {
rowCacheStart: number
rowCacheEnd: number
rowVisibleStart: number
rowVisibleEnd: number
}
type RowSlotProps = {
columns: Column<any>[]
rowData: any
columnIndex: number
rowIndex: number
data: any
key: number | string
isScrolling?: boolean
style: CSSProperties
}
type RowExpandParams = {
expanded: boolean
rowKey: KeyType
} & RowCommonParams
type Data = {
[key: KeyType]: any
children?: Array<any>
}
type FixedData = Data
type KeyType = string | number | symbol
type ColumnSortParam<T> = { column: Column<T>; key: KeyType; order: SortOrder }
enum SortOrder {
ASC = 'asc',
DESC = 'desc',
}
type SortBy = { key: KeyType; Order: SortOrder }
type SortState = Record<KeyType, SortOrder>
FAQs
How do I render a list with a checkbox in the first column?
Since you are allowed to define your own cell renderer, you can do what the example Customize Cell Renderer did to render checkbox
yourself, and maintain the state by yourself.
Why does virtualized table provide less features than TableV1
For virtualized table, we intend to provide less feature and let our users implement their own features as needed. Integrar demasiadas características hace que el código sea difícil de mantener y para la mayoría de los usuarios las características básicas son suficientes. Algunas características clave aún no han sido desarrolladas. ¡Queremos saber tu opinión! Únete a Discord para estar atento.
Fuente
Componentes • Style • Documentación