Этот документ описывает, как использовать Vue-компонент Table для создания мощных и настраиваемых таблиц с поддержкой REST API на базе библиотеки flamerest.
Для использования компонента, сперва установите его и peer-зависимости из npm:
npm install flameresttable flamerest
Затем импортируйте компонент и его утилиты в вашем Vue-файле.
<template>
<Table
:model="Model"
:opts="opts"
ref="postsTable"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import Model from '@/models/Houses'; // тут указание на модель конкретной REST-таблицы, а имя всегда Model
import Table from 'flameresttable/src/Table/Table.vue';
import TableOpts from 'flameresttable/src/Table/TableOpts';
const postsTable = ref<InstanceType<typeof Table>>();
const opts = new TableOpts();
// ... дальнейшая настройка объекта opts
</script>
REST.Model из пакета flamerest.Ключевые опции, которые задаются в экземпляре TableOpts.
Для динамического управления колонками в объекте opts есть несколько удобных методов.
// Установить ширину для колонки 'id'
opts.set('id', { Table: { width: 100 } });
// Установить один и тот же заголовок для нескольких колонок
opts.set(['created_at', 'updated_at'], { Table: { title: 'Дата' } });
isShow: false.// Скрыть системную колонку
opts.delete('internal_id');
// Добавить виртуальный фильтр по диапазону дат
opts.addVirtual('date_range', {
Filter: { isShow: true, type: 'daterange', title: 'Период создания' },
Table: { isShow: false }, // саму колонку в таблице не показываем
Popup: { isShow: false }
});
Опции для каждой колонки задаются через метод opts.set('columnName', { ... }). Ниже представлено детальное описание всех доступных свойств.
true, колонка не будет запрашиваться с бэкенда в основном запросе. Полезно для кастомных фильтров (например, диапазон дат, который на бэкенде разбирается в два отдельных поля).Table: object - Настройки отображения в таблицеFilter: object - Настройки фильтраPopup: object - Настройки поля в форме добавления/редактированияSelector: object - Настройки для связанных данных (для фильтров и полей `selector`)[{ id: 'val', title: 'Label' }].Доступ к методам и состоянию таблицы осуществляется через ref. Например: postsTable.value.Table.update().
Компонент предоставляет несколько слотов для глубокой кастомизации.
#defaultButtons и #otherButtonsДля добавления кастомных кнопок на панель управления.
<Table :opts="opts" ref="table">
<template #otherButtons>
<button @click="showSelected">Показать выбранных</button>
</template>
</Table>
#CustomRowПолностью заменяет рендеринг строки. Используется, когда opts.displayMode = 'custom'.
Параметры: row, edit, remove, table.
<!-- opts.displayMode = 'custom'; -->
<Table :opts="opts">
<template #CustomRow="{ row, edit, remove }">
<div class="my-card">
<h5>{{ row.username }}</h5>
<button @click="edit()">Edit</button>
</div>
</template>
</Table>
#RowSubSlotОтображает контент в раскрывающемся под-пространстве под строкой (когда opts.onRowClickOpenSlot = 'rowspace').
Параметры: row.
<!-- opts.onRowClickOpenSlot = 'rowspace'; -->
<Table :opts="opts">
<template #RowSubSlot="{ row }">
<div>Детали заказа №{{ row.id }}</div>
</template>
</Table>
Существуют также слоты, позволяющие заменить основные части стандартной таблицы:
#TableHeaders: для полной замены заголовка таблицы.#Row: для замены рендеринга одной строки в стандартном режиме 'table'.#header: для добавления контента в заголовок модального окна добавления/редактирования.Ниже приведен пример из реального проекта для настройки таблицы постов.
// В <script setup>
import { ref } from 'vue';
import Model from '@/models/Userprojectsposts'; // импортируем модель как Model
import Table from 'flameresttable/src/Table/Table.vue';
import TableOpts from 'flameresttable/src/Table/TableOpts';
// 1. Инициализация
const postsTable = ref<InstanceType<typeof Table>>();
const opts = new TableOpts();
// 2. Настройка глобального поведения
opts.Add.can = false;
opts.Edit.can = false;
opts.Remove.can = true;
opts.lang = "ru";
opts.Pagination.type = 'scrollable';
opts.Export.isShow = false;
opts.rowSelectors = false; // Отключаем чекбоксы выбора
// 3. Пакетная настройка колонок
// Скрываем все фильтры по умолчанию, чтобы потом включить только нужные
Object.keys(new Model()).forEach(key => {
opts.set(key, { Filter: { isShow: false } });
});
// 4. Точечная настройка нужных колонок и фильтров
opts.set("id", {
title: 'ID',
Filter: { isShow: true, type: 'number' },
Table: { width: 80 }
});
opts.set("status", {
title: 'Статус',
Filter: {
isShow: true,
type: 'selector',
selector: { multiselect: true }
},
Selector: {
values: [ // Задаем статические значения для селектора
{ id: '0', title: 'Придуман' },
{ id: '1', title: 'Запощен' },
{ id: '2', title: 'Отменён' },
]
}
});
<!-- В <template> -->
<Table
:model="Model"
:opts="opts"
ref="postsTable"
/>