Фильтрация данных в таблицах является важным инструментом для управления большими наборами информации и повышения удобства взаимодействия с интерфейсом. В библиотеке Carbon Components Svelte реализованы компоненты и паттерны, которые позволяют эффективно организовать фильтрацию строк таблицы с минимальной ручной работой и высокой кастомизацией.
Компонент DataTable Основной
контейнер для работы с таблицами в Carbon Svelte — это
<DataTable>. Он принимает набор колонок и строк, а
также предоставляет вспомогательные свойства и методы для управления
состоянием таблицы.
<DataTable {rows} {headers}>
<Table>
<TableHead />
<TableBody />
</Table>
</DataTable>
rows — массив объектов, каждый объект представляет
строку таблицы.headers — массив объектов с ключами key и
header, определяющими название и идентификатор
колонки.Ключевые свойства для фильтрации
rows может быть динамически изменяемым массивом, что
позволяет фильтровать строки на лету.selectedRows хранит выделенные строки, что удобно для
интеграции фильтров с выбором элементов.Для фильтрации часто используется компонент
<TextInput> из Carbon, связанный с фильтруемыми
строками таблицы:
<script>
import { DataTable, Table, TableHead, TableBody, TableRow, TableCell, TextInput } from 'carbon-components-svelte';
let filterText = '';
let rows = [
{ id: '1', name: 'Alice', role: 'Developer' },
{ id: '2', name: 'Bob', role: 'Designer' },
{ id: '3', name: 'Charlie', role: 'Manager' }
];
const headers = [
{ key: 'name', header: 'Имя' },
{ key: 'role', header: 'Должность' }
];
$: filteredRows = rows.filter(row =>
Object.values(row).some(value =>
String(value).toLowerCase().includes(filterText.toLowerCase())
)
);
</script>
<TextInput bind:value={filterText} labelText="Фильтр по таблице" />
<DataTable {headers} rows={filteredRows}>
<Table>
<TableHead />
<TableBody let:row>
<TableRow>
<TableCell>{row.name}</TableCell>
<TableCell>{row.role}</TableCell>
</TableRow>
</TableBody>
</Table>
</DataTable>
Ключевые моменты:
$: filteredRows
позволяет динамически обновлять содержимое таблицы при изменении текста
фильтра.Object.values(row).some(...) обеспечивает
универсальную фильтрацию по всем колонкам строки.Если требуется фильтровать конкретное поле, логика упрощается:
$: filteredRows = rows.filter(row =>
row.role.toLowerCase().includes(filterText.toLowerCase())
);
<TextInput> или
выпадающих списков <Dropdown>.TableToolbarCarbon Components Svelte предоставляет TableToolbar,
который объединяет элементы управления таблицей:
<TableToolbar>
<TableToolbarContent>
<TextInput bind:value={filterText} labelText="Фильтр по имени" />
</TableToolbarContent>
</TableToolbar>
TableToolbar, визуально и
функционально соответствует рекомендациям IBM Carbon Design.TableToolbarSearch упрощает фильтрацию и
автоматически обеспечивает доступность (a11y).Для таблиц с сотнями и тысячами строк фильтрация на стороне клиента может быть медленной. Рекомендации по оптимизации:
Дебаунсинг ввода Использовать
setTimeout или svelte-use для задержки
фильтрации после ввода текста.
let filterText = '';
let debouncedText = '';
let timeout;
$: {
clearTimeout(timeout);
timeout = setTimeout(() => debouncedText = filterText, 300);
}
$: filteredRows = rows.filter(row =>
row.name.toLowerCase().includes(debouncedText.toLowerCase())
);Виртуализация строк Для рендеринга тысяч
элементов использовать сторонние библиотеки виртуализации, например
svelte-virtual-list, чтобы рендерить только видимые
строки.
Множественные фильтры При необходимости фильтровать одновременно по нескольким колонкам:
$: filteredRows = rows.filter(row =>
row.name.toLowerCase().includes(nameFilter.toLowerCase()) &&
row.role.toLowerCase().includes(roleFilter.toLowerCase())
);Фильтрация с регулярными выражениями Позволяет гибко находить совпадения:
$: regex = new RegExp(filterText, 'i');
$: filteredRows = rows.filter(row => regex.test(row.name));Фильтрация через коллбэк Полезно, если данные приходят с сервера и фильтр должен быть сложным:
function filterRows(row) {
return row.active && row.role.startsWith('D');
}
$: filteredRows = rows.filter(filterRows);DataTable): при
фильтрации строки остаются частью состояния таблицы, что важно для
правильной работы сортировки и выделения.aria-label и
aria-controls.Эти подходы обеспечивают мощную, гибкую и масштабируемую фильтрацию строк в таблицах Carbon Components Svelte, позволяя создавать интерактивные и удобные интерфейсы с минимальным количеством кастомного кода.