DataGrid
Uma tabela de dados que ordena, filtra, pagina e seleciona, localmente ou no seu servidor, com colunas que o leitor pode redimensionar, reordenar, fixar e ocultar.
Importação
import { DataGrid } from '@vitral/vue';Ordenar, filtrar, paginar e selecionar
Clique num cabeçalho para ordenar, digite abaixo dele para filtrar (os acentos são ignorados: “sao” encontra São Paulo), busque em todas as colunas de uma vez pelo cabeçalho, e marque linhas.
| Ximena Diallo | São Paulo · Brazil | 15 de set. de 2020 | € 4.586,25 | Offline | |
| Noémie Nowak | Zürich · Switzerland | 7 de out. de 2023 | € 5.484,63 | Offline | |
| Bruno Nowak | Kraków · Poland | 23 de dez. de 2022 | € 456,73 | Away | |
| Quentin Gómez | Tōkyō · Japan | 26 de nov. de 2023 | € 5.444,92 | Active | |
| Hanna Mendes | Reykjavík · Iceland | 9 de jun. de 2021 | € 16.745,23 | Away | |
| Wiktor Lima | Kraków · Poland | 15 de jul. de 2020 | € 6.428,86 | Active | |
| Bruno Rocha | Tōkyō · Japan | 26 de ago. de 2021 | € 8.297,10 | Active | |
| Gustavo Rocha | Québec · Canada | 15 de abr. de 2021 | € 10.280,87 | Active |
Ordenação múltipla, seleção única, linhas de grade
Ordenado por país e depois por saldo, do maior para o menor. Ctrl-clique (⌘-clique) num cabeçalho para adicioná-lo à ordenação. Clique numa linha, ou foque as linhas e use as setas e Espaço, para escolher uma. O cabeçalho continua visível enquanto o corpo rola.
| Diego Ferreira | Argentina | Córdoba | € 15.492,29 |
| Noémie Fontaine | Argentina | Córdoba | € 9.472,17 |
| Ximena Ferreira | Argentina | Córdoba | € 2.865,18 |
| Bruno Martin | Brazil | Florianópolis | € 17.876,33 |
| Élise Dubois | Brazil | São Paulo | € 14.269,79 |
| Bruno Souza | Brazil | Florianópolis | € 13.363,03 |
| Bruno Lima | Brazil | São Paulo | € 12.562,40 |
| Ana Gómez | Brazil | Recife | € 11.750,51 |
| Fatou Ferreira | Brazil | São Paulo | € 10.543,41 |
| Oskar Martin | Brazil | São Paulo | € 10.400,34 |
| Ximena Diallo | Brazil | São Paulo | € 4.586,25 |
| Bruno Rocha | Canada | Montréal | € 17.103,69 |
| João Etxeberria | Canada | Montréal | € 11.302,35 |
| Wiktor Jónsson | Canada | Québec | € 10.857,06 |
| Gustavo Rocha | Canada | Québec | € 10.280,87 |
| Élise Sato | Canada | Québec | € 4.759,90 |
| Hanna Souza | Canada | Québec | € 2.684,86 |
| Ximena Souza | Colombia | Bogotá | € 9.305,62 |
| Valéria Fontaine | Colombia | Bogotá | € 7.948,90 |
| Ana Jónsson | Colombia | Bogotá | € 4.625,47 |
| Ana Lima | Germany | München | € 15.860,46 |
| Kenji Costa | Germany | Köln | € 11.732,89 |
| Hanna Martin | Germany | München | € 7.969,50 |
| Mateus Dubois | Germany | Köln | € 3.976,73 |
| João Etxeberria | Germany | Köln | € 3.947,82 |
| Carla Lima | Germany | München | € 2.002,67 |
| Hanna Mendes | Iceland | Reykjavík | € 16.745,23 |
| Diego Costa | Iceland | Reykjavík | € 13.914,59 |
| Fatou Fontaine | Iceland | Reykjavík | € 13.839,42 |
| Wiktor Fontaine | Iceland | Reykjavík | € 13.239,60 |
| Tomás Dubois | Iceland | Reykjavík | € 12.242,07 |
| Tomás Ferreira | Iceland | Reykjavík | € 8.764,27 |
| Bruno Rocha | Japan | Tōkyō | € 8.297,10 |
| Kenji Costa | Japan | Tōkyō | € 8.098,99 |
| Carla Diallo | Japan | Tōkyō | € 5.945,52 |
| Quentin Gómez | Japan | Tōkyō | € 5.444,92 |
| João Martin | Japan | Tōkyō | € 5.028,76 |
| Valéria Álvarez | Japan | Tōkyō | € 2.964,27 |
| Wiktor Costa | Japan | Tōkyō | -€ 1.790,27 |
| Fatou Rocha | Japan | Tōkyō | -€ 1.940,60 |
| Iñaki Dubois | Poland | Kraków | € 17.709,64 |
| Wiktor Costa | Poland | Kraków | € 17.144,37 |
| João Gómez | Poland | Kraków | € 12.230,50 |
| Wiktor Lima | Poland | Kraków | € 6.428,86 |
| Wiktor Ferreira | Poland | Kraków | € 1.503,44 |
| Wiktor Costa | Poland | Kraków | € 504,85 |
| Bruno Nowak | Poland | Kraków | € 456,73 |
| Wiktor Souza | Poland | Kraków | -€ 303,08 |
| Fatou Ferreira | Portugal | Évora | € 12.014,06 |
| Fatou Jónsson | Portugal | Lisboa | € 10.703,89 |
| Ana Etxeberria | Portugal | Lisboa | € 7.618,88 |
| Raquel Diallo | Portugal | Lisboa | -€ 493,76 |
| Bruno Lima | Spain | Málaga | € 17.131,64 |
| Noémie Sato | Spain | Málaga | € 9.951,09 |
| João Nowak | Spain | Málaga | € 4.612,00 |
| Fatou Gómez | Spain | Málaga | € 755,90 |
| Kenji Nowak | Spain | Málaga | -€ 776,43 |
| Carla Fontaine | Switzerland | Zürich | € 15.325,86 |
| Ximena Etxeberria | Switzerland | Zürich | € 11.252,24 |
| Søren Müller | Switzerland | Zürich | € 11.236,83 |
| Élise Lima | Switzerland | Zürich | € 8.895,92 |
| Noémie Nowak | Switzerland | Zürich | € 5.484,63 |
| Zoë Mendes | Switzerland | Zürich | € 2.202,54 |
| Wiktor Lima | Switzerland | Zürich | € 1.071,43 |
Colunas que o leitor organiza
Arraste um cabeçalho para mover uma coluna, ou segure Ctrl (⌘) e pressione uma seta. Arraste a borda de um cabeçalho para definir a largura — a alça está na ordem de tabulação, então as setas também fazem isso, e Shift dá passos maiores. Name e Balance ficam fixas nas bordas e permanecem enquanto o resto rola para o lado. O botão abre a lista de colunas. Tudo o que o leitor faz é um único objeto, `columnLayout`, que uma aplicação pode guardar e devolver.
| Role | Status | Balance | |||
|---|---|---|---|---|---|
| Ximena Diallo | Brazil | São Paulo | Offline | € 4.586,25 | |
| Noémie Nowak | Switzerland | Zürich | Offline | € 5.484,63 | |
| Bruno Nowak | Poland | Kraków | Away | € 456,73 | |
| Quentin Gómez | Japan | Tōkyō | Active | € 5.444,92 | |
| Hanna Mendes | Iceland | Reykjavík | Away | € 16.745,23 | |
| Wiktor Lima | Poland | Kraków | Active | € 6.428,86 | |
| Bruno Rocha | Japan | Tōkyō | Active | € 8.297,10 | |
| Gustavo Rocha | Canada | Québec | Active | € 10.280,87 |
Duas tabelas, um só conjunto de colunas
`group` é um nome que duas tabelas compartilham: reorganize uma coluna em qualquer uma e as duas acompanham, e rolar uma para o lado rola a outra. As linhas são de cada tabela — aqui, este trimestre acima do trimestre passado.
| Name | Country | City | Balance |
|---|---|---|---|
| Ximena Diallo | Brazil | São Paulo | € 4.586,25 |
| Noémie Nowak | Switzerland | Zürich | € 5.484,63 |
| Bruno Nowak | Poland | Kraków | € 456,73 |
| Quentin Gómez | Japan | Tōkyō | € 5.444,92 |
| Name | Country | City | Balance |
|---|---|---|---|
| Hanna Mendes | Iceland | Reykjavík | € 16.745,23 |
| Wiktor Lima | Poland | Kraków | € 6.428,86 |
| Bruno Rocha | Japan | Tōkyō | € 8.297,10 |
| Gustavo Rocha | Canada | Québec | € 10.280,87 |
Agrupado, do jeito que se lê uma base
`group-by` reúne as linhas por um campo e põe um título sobre cada bloco, com a contagem e um botão para recolher. Isso acontece depois da consulta, então a ordenação e os filtros continuam decidindo quais linhas existem — e as linhas são reunidas por valor, e não por vizinhança, então ordenar por outra coluna mantém cada grupo junto e ordena dentro dele. `v-model:collapsedGroups` é o que o leitor fechou, e uma aplicação pode guardar isso.
| Ana Etxeberria | Lisboa | Portugal | Active | € 7.618,88 |
| Fatou Ferreira | Évora | Portugal | Offline | € 12.014,06 |
| Fatou Jónsson | Lisboa | Portugal | Offline | € 10.703,89 |
| Raquel Diallo | Lisboa | Portugal | Offline | -€ 493,76 |
| Ana Gómez | Recife | Brazil | Active | € 11.750,51 |
| Bruno Lima | São Paulo | Brazil | Away | € 12.562,40 |
| Bruno Martin | Florianópolis | Brazil | Active | € 17.876,33 |
| Bruno Souza | Florianópolis | Brazil | Active | € 13.363,03 |
| Élise Dubois | São Paulo | Brazil | Active | € 14.269,79 |
| Fatou Ferreira | São Paulo | Brazil | Blocked | € 10.543,41 |
| Oskar Martin | São Paulo | Brazil | Away | € 10.400,34 |
| Ximena Diallo | São Paulo | Brazil | Offline | € 4.586,25 |
| Ana Jónsson | Bogotá | Colombia | Offline | € 4.625,47 |
| Valéria Fontaine | Bogotá | Colombia | Away | € 7.948,90 |
| Ximena Souza | Bogotá | Colombia | Offline | € 9.305,62 |
| Ana Lima | München | Germany | Active | € 15.860,46 |
| Carla Lima | München | Germany | Away | € 2.002,67 |
| Hanna Martin | München | Germany | Blocked | € 7.969,50 |
| João Etxeberria | Köln | Germany | Active | € 3.947,82 |
| Kenji Costa | Köln | Germany | Active | € 11.732,89 |
| Mateus Dubois | Köln | Germany | Away | € 3.976,73 |
| Bruno Lima | Málaga | Spain | Active | € 17.131,64 |
| Fatou Gómez | Málaga | Spain | Blocked | € 755,90 |
| João Nowak | Málaga | Spain | Active | € 4.612,00 |
| Kenji Nowak | Málaga | Spain | Active | -€ 776,43 |
| Noémie Sato | Málaga | Spain | Active | € 9.951,09 |
| Bruno Nowak | Kraków | Poland | Away | € 456,73 |
| Iñaki Dubois | Kraków | Poland | Blocked | € 17.709,64 |
| João Gómez | Kraków | Poland | Away | € 12.230,50 |
| Wiktor Costa | Kraków | Poland | Blocked | € 17.144,37 |
| Wiktor Costa | Kraków | Poland | Blocked | € 504,85 |
| Wiktor Ferreira | Kraków | Poland | Active | € 1.503,44 |
| Wiktor Lima | Kraków | Poland | Active | € 6.428,86 |
| Wiktor Souza | Kraków | Poland | Active | -€ 303,08 |
| Bruno Rocha | Tōkyō | Japan | Active | € 8.297,10 |
| Carla Diallo | Tōkyō | Japan | Active | € 5.945,52 |
| Fatou Rocha | Tōkyō | Japan | Blocked | -€ 1.940,60 |
| João Martin | Tōkyō | Japan | Away | € 5.028,76 |
| Kenji Costa | Tōkyō | Japan | Offline | € 8.098,99 |
| Quentin Gómez | Tōkyō | Japan | Active | € 5.444,92 |
| Valéria Álvarez | Tōkyō | Japan | Offline | € 2.964,27 |
| Wiktor Costa | Tōkyō | Japan | Active | -€ 1.790,27 |
| Bruno Rocha | Montréal | Canada | Offline | € 17.103,69 |
| Élise Sato | Québec | Canada | Offline | € 4.759,90 |
| Gustavo Rocha | Québec | Canada | Active | € 10.280,87 |
| Hanna Souza | Québec | Canada | Blocked | € 2.684,86 |
| João Etxeberria | Montréal | Canada | Away | € 11.302,35 |
| Wiktor Jónsson | Québec | Canada | Active | € 10.857,06 |
| Carla Fontaine | Zürich | Switzerland | Offline | € 15.325,86 |
| Élise Lima | Zürich | Switzerland | Active | € 8.895,92 |
| Noémie Nowak | Zürich | Switzerland | Offline | € 5.484,63 |
| Søren Müller | Zürich | Switzerland | Away | € 11.236,83 |
| Wiktor Lima | Zürich | Switzerland | Active | € 1.071,43 |
| Ximena Etxeberria | Zürich | Switzerland | Away | € 11.252,24 |
| Zoë Mendes | Zürich | Switzerland | Away | € 2.202,54 |
| Diego Costa | Reykjavík | Iceland | Offline | € 13.914,59 |
| Fatou Fontaine | Reykjavík | Iceland | Away | € 13.839,42 |
| Hanna Mendes | Reykjavík | Iceland | Away | € 16.745,23 |
| Tomás Dubois | Reykjavík | Iceland | Active | € 12.242,07 |
| Tomás Ferreira | Reykjavík | Iceland | Offline | € 8.764,27 |
| Wiktor Fontaine | Reykjavík | Iceland | Away | € 13.239,60 |
| Diego Ferreira | Córdoba | Argentina | Away | € 15.492,29 |
| Noémie Fontaine | Córdoba | Argentina | Away | € 9.472,17 |
| Ximena Ferreira | Córdoba | Argentina | Active | € 2.865,18 |
De uma fonte de dados
As linhas vêm de `createDataSource({ load })`, que faz as vezes de um servidor que responde em 450 ms. A tabela pede uma página por vez, com a ordenação e a busca; uma resposta lenta que chega depois de uma mais nova é descartada.
| Nenhuma opção disponível | ||
Vazio e carregando
| Invoice | Amount |
|---|---|
| No invoices this month | |
| Name | City |
|---|---|
| Ximena Diallo | São Paulo |
| Noémie Nowak | Zürich |
| Bruno Nowak | Kraków |
| Quentin Gómez | Tōkyō |
API
Lido de packages/vue/src/components/DataGrid/types.ts, então diz o que o componente aceita de fato.
Props
| Nome | Tipo | Descrição |
|---|---|---|
| groupBy | string | Agrupa as linhas por este campo e põe um cabeçalho sobre cada bloco, com uma contagem e um botão de alternar. O agrupamento acontece depois da consulta, então ordenação e filtros continuam decidindo quais linhas existem; `v-model:collapsedGroups` guarda quais delas o leitor fechou. |
| groupLabel | (context: { value: unknown; count: number; rows: any[] }) => string | O que o cabeçalho de um grupo diz; por padrão, o próprio valor. |
| value | any[] | — |
| dataKey | string | Um campo que identifica uma linha, para a seleção e as chaves das linhas. |
| dataSource | DataSourceLike | As linhas vêm de uma fonte de dados, local ou remota, em vez de `value`. |
| lazy | boolean | Nada é calculado aqui: mudanças de ordenação, filtro e página são emitidas (`lazy-load`) para a aplicação responder. |
| totalRecords | number | O total de todas as páginas quando `lazy`. |
| loading | boolean | — |
| paginator | boolean | — |
| rowsPerPageOptions | number[] | — |
| pageLinkSize | number | — |
| paginatorTemplate | string | ('FirstPageLink' | 'PrevPageLink' | 'PageLinks' | 'NextPageLink' | 'LastPageLink' | 'RowsPerPageDropdown' | 'CurrentPageReport')[] | — |
| currentPageReportTemplate | string | — |
| paginatorPosition | 'top' | 'bottom' | — |
| alwaysShowPaginator | boolean | — |
| sortMode | 'single' | 'multiple' | — |
| removableSort | boolean | Um terceiro clique numa coluna ordenada a tira da ordenação. |
| globalFilterFields | string[] | — |
| filterDisplay | 'row' | `'row'` põe uma caixa de filtro sob o cabeçalho de cada coluna filtrável. |
| filterDelay | number | Milissegundos a esperar depois da digitação antes de consultar de novo uma tabela lazy ou uma fonte de dados. |
| selectionMode | 'single' | 'multiple' | — |
| resizableColumns | boolean | Uma alça na borda final de cada coluna, arrastada (ou usada pelo teclado) para definir sua largura. |
| columnResizeMode | 'fit' | 'expand' | `'fit'` tira a largura da coluna seguinte, mantendo a da tabela; `'expand'` alarga a tabela. |
| reorderableColumns | boolean | As colunas podem ser arrastadas pelo cabeçalho para outra ordem, ou movidas com Ctrl e uma seta. |
| columnToggle | boolean | Um botão que abre a lista de colunas, cada uma com um checkbox. |
| group | string | Um nome que duas tabelas compartilham: elas rolam na horizontal juntas e mantêm um só layout de colunas. |
| stripedRows | boolean | — |
| showGridlines | boolean | — |
| size | Size | — |
| scrollable | boolean | — |
| scrollHeight | string | Uma altura CSS, ou `'flex'` para preencher um pai flex. O cabeçalho fica visível. |
| emptyMessage | string | — |
| rowClass | (data: any) => unknown | — |
| tableStyle | string | Record<string, string> | — |
| caption | string | Dá nome à tabela. Oculto a menos que `showCaption`; sem ele, nomeie a tabela com `aria-label`. |
| showCaption | boolean | — |
Mais pt, dt e unstyled de BaseProps; veja pass-through e modo sem estilo.
Emits
| Evento | Payload | Descrição |
|---|---|---|
| page | event: DataGridPageEvent | — |
| column-resize | event: DataGridColumnEvent & { width: number } | Uma coluna foi alargada ou estreitada. |
| column-reorder | event: DataGridColumnEvent & { order: string[] } | Uma coluna foi movida. |
| column-toggle | event: DataGridColumnEvent & { visible: boolean } | Uma coluna foi mostrada ou ocultada. |
| column-pin | event: DataGridColumnEvent & { side: 'left' | 'right' | null } | Uma coluna foi fixada numa borda, ou solta. |
| sort | event: DataGridSortEvent | — |
| filter | event: DataGridFilterEvent | — |
| lazy-load | event: LoadOptionsLike | — |
| row-click | event: DataGridRowClickEvent | — |
| row-select | event: DataGridRowSelectEvent | — |
| row-unselect | event: DataGridRowSelectEvent | — |
| row-select-all | event: DataGridSelectAllEvent | — |
| row-unselect-all | event: DataGridSelectAllEvent | — |
Slots
| Nome | Props do slot | Descrição |
|---|---|---|
| default | — | Os `<Column>`s. |
| header | — | — |
| footer | — | — |
| empty | — | — |
| loadingicon | — | — |
| paginatorstart | (props: DataGridPageEvent) | — |
| paginatorend | (props: DataGridPageEvent) | — |