Ключевые компоненты: QTable, QForm, QInput, QSelect, QDialog
↑ 5.3 Quasar · ← Предыдущая · → Следующая
Зачем это на собесе
Самые используемые компоненты: таблицы с серверной пагинацией, формы, селекты, диалоги.
Объяснение
QTable — таблица: сортировка, фильтр, пагинация, выбор строк, слоты.
<q-table
v-model:pagination="pagination" v-model:selected="selected" selection="multiple"
:rows="rows" :columns="columns" row-key="id" :loading="loading" :filter="filter"
binary-state-sort :rows-per-page-options="[10, 20, 50]"
@request="onRequest"> <!-- серверная пагинация/сортировка -->
<template #body-cell-status="props"><q-td :props="props"><q-badge :color="color(props.value)">{{ props.value }}</q-badge></q-td></template>
<template #top-right><q-input dense debounce="300" v-model="filter" placeholder="Поиск"><template #append><q-icon name="search" /></template></q-input></template>
<template #no-data>Нет данных</template>
</q-table>const columns: QTableColumn[] = [{ name: "number", label: "№", field: "number", sortable: true, align: "left" }, { name: "total", label: "Сумма", field: (r) => r.total, format: (v) => fmt(v) }];
async function onRequest({ pagination: p, filter }: { pagination: QTableProps["pagination"]; filter?: string }) {
loading.value = true;
const res = await api.list({ page: p!.page, size: p!.rowsPerPage, sort: p!.sortBy, desc: p!.descending, q: filter });
rows.value = res.items; pagination.value = { ...p!, rowsNumber: res.total }; // rowsNumber обязателен для серверной пагинации
loading.value = false;
}Формы и поля:
<q-form @submit.prevent="save" @reset="reset" greedy>
<q-input v-model="f.name" label="Имя" outlined dense :rules="[required, minLen(2)]" lazy-rules clearable />
<q-select v-model="f.status" :options="statuses" emit-value map-options option-value="id" option-label="title" use-input @filter="filterFn" multiple use-chips />
<q-checkbox v-model="f.agree" label="Согласен" /><q-toggle v-model="f.active" /><q-date v-model="f.date" mask="YYYY-MM-DD" />
<q-btn type="submit" color="primary" label="Сохранить" :loading="saving" />
</q-form>QDialog:
<q-dialog v-model="open" persistent>
<q-card style="min-width: 350px"><q-card-section class="text-h6">Подтверждение</q-card-section>
<q-card-actions align="right"><q-btn flat label="Отмена" v-close-popup /><q-btn color="negative" label="Удалить" @click="del" /></q-card-actions>
</q-card>
</q-dialog>Также: QBtn, QCard, QList/QItem, QMenu, QTooltip, QTabs, QStepper, QExpansionItem, QTree, QVirtualScroll, QInfiniteScroll, QPagination, QSkeleton, QUploader, QBadge, QChip, QAvatar.
Нюансы и подводные камни
- Для серверной пагинации нужен
@requestиrowsNumber; без них таблица обрабатывает данные на клиенте. q-selectс объектами:emit-valueиmap-optionsдля примитивного значения.use-input+@filter— асинхронный поиск, вызыватьupdate().lazy-rulesоткладывает проверку до потери фокуса.- Большие таблицы: виртуальная прокрутка (
virtual-scroll), пагинация.
Практика
- Сделайте таблицу с серверной пагинацией, сортировкой и поиском.
- Соберите форму с валидацией и
q-selectс поиском. - Реализуйте диалог подтверждения удаления.
Вопросы с ответами
Как сделать серверную пагинацию в QTable?
Обработать событие
@request, загрузить страницу и обновитьpaginationсrowsNumber.
Что делают
emit-valueиmap-optionsу QSelect?
emit-valueкладёт в модель только значение опции,map-optionsпоказывает соответствующую метку.