Компонент QTable в библиотеке Quasar предназначен для отображения табличных данных с поддержкой сортировки, фильтрации, пагинации, виртуализации и кастомизации отображения. Он объединяет в себе функциональность стандартной HTML-таблицы и мощный набор инструментов для работы с большими массивами данных.
QTable строится на декларативной модели: данные, структура колонок и поведение задаются через свойства (props), а визуализация может гибко настраиваться через слоты.
Минимальная конфигурация QTable включает два ключевых параметра:
rows — массив данныхcolumns — описание колонокconst rows = [
{ name: 'John', age: 30, city: 'New York' },
{ name: 'Anna', age: 25, city: 'London' }
]
const columns = [
{
name: 'name',
label: 'Имя',
field: 'name',
align: 'left',
sortable: true
},
{
name: 'age',
label: 'Возраст',
field: 'age',
sortable: true
},
{
name: 'city',
label: 'Город',
field: 'city'
}
]
<q-table
:rows="rows"
:columns="columns"
row-key="name"
/>
Каждая колонка представляет объект с набором параметров:
left,
right, center)Пример с функцией:
{
name: 'age',
label: 'Возраст',
field: row => row.age,
format: val => `${val} лет`
}
QTable поддерживает сортировку из коробки. Для включения достаточно
указать sortable: true.
Дополнительно можно задать пользовательскую логику:
{
name: 'age',
label: 'Возраст',
field: 'age',
sortable: true,
sort: (a, b) => a - b
}
Начальное состояние сортировки задаётся через
pagination:
const pagination = {
sortBy: 'age',
descending: false,
page: 1,
rowsPerPage: 10
}
<q-table
:rows="rows"
:columns="columns"
:pagination.sync="pagination"
/>
QTable автоматически разбивает данные на страницы. Управление
осуществляется через объект pagination.
Основные параметры:
page — текущая страницаrowsPerPage — количество строкrowsNumber — общее количество (для серверной
пагинации)Отключение пагинации:
<q-table
:rows="rows"
:columns="columns"
:pagination="{ rowsPerPage: 0 }"
/>
Фильтрация выполняется через свойство filter:
<q-input v-model="filter" placeholder="Поиск..." />
<q-table
:rows="rows"
:columns="columns"
:filter="filter"
/>
По умолчанию фильтр ищет по всем колонкам.
Для кастомной логики используется filter-method:
function customFilter(rows, terms) {
return rows.filter(row =>
row.name.toLowerCase().includes(terms.toLowerCase())
)
}
<q-table
:rows="rows"
:columns="columns"
:filter="filter"
:filter-method="customFilter"
/>
QTable активно использует слоты для переопределения отображения.
<template v-slot:body-cell-name="props">
<q-td :props="props">
<strong>{{ props.value }}</strong>
</q-td>
</template>
<template v-slot:body="props">
<q-tr :props="props">
<q-td key="name">{{ props.row.name }}</q-td>
<q-td key="age">{{ props.row.age }}</q-td>
</q-tr>
</template>
<template v-slot:header="props">
<q-tr :props="props">
<q-th
v-for="col in props.cols"
:key="col.name"
>
{{ col.label.toUpperCase() }}
</q-th>
</q-tr>
</template>
Поддерживается одиночный и множественный выбор:
<q-table
:rows="rows"
:columns="columns"
selection="multiple"
v-model:selected="selected"
/>
Доступные режимы:
singlemultiplenoneДля работы с API используется серверная пагинация, сортировка и фильтрация.
Ключевые параметры:
rowsNumber — общее количество строк@request<q-table
:rows="rows"
:columns="columns"
:pagination="pagination"
:loading="loading"
@request="onRequest"
/>
function onRequest(props) {
const { page, rowsPerPage, sortBy, descending } = props.pagination
loading.value = true
api.getData({ page, rowsPerPage, sortBy, descending })
.then(response => {
rows.value = response.data
pagination.value.rowsNumber = response.total
})
.finally(() => {
loading.value = false
})
}
Для больших массивов данных используется виртуализация:
<q-table
:rows="rows"
:columns="columns"
virtual-scroll
:rows-per-page-options="[0]"
/>
Преимущества:
<template v-slot:body="props">
<q-tr :props="props">
<q-td>{{ props.row.name }}</q-td>
</q-tr>
<q-tr v-if="props.expand">
<q-td colspan="100%">
Дополнительная информация
</q-td>
</q-tr>
</template>
<q-table
:visible-columns="visibleColumns"
/>
const visibleColumns = ['name', 'age']
QTable поддерживает стили через props:
dense — компактный режимflat — без тениbordered — с границамиsquare — без скруглений<q-table
dense
bordered
flat
/>
Часто используется вместе с:
Пример панели управления:
<div class="row q-gutter-md">
<q-input v-model="filter" label="Поиск" />
<q-select v-model="selectedCity" :options="cities" />
</div>
Рекомендации:
row-key для уникальной идентификацииvirtual-scroll при больших данныхcolumns.formatQTable выступает как универсальный инструмент для работы с табличными структурами, обеспечивая баланс между простотой использования и глубокой кастомизацией.