TreeSelect в библиотеке Ant Design — это мощный компонент для выбора одного или нескольких значений из иерархического дерева данных. Он сочетает в себе удобство выпадающего списка и структуру древовидных данных, что особенно полезно при работе с категориями, тегами или вложенными объектами.
Базовый импорт и использование:
import { TreeSelect } from 'antd';
import React, { useState } from 'react';
const { TreeNode } = TreeSelect;
const Demo = () => {
const [value, setValue] = useState(undefined);
const onCha nge = (newValue) => {
setValue(newValue);
};
return (
<TreeSelect
style={{ width: 300 }}
value={value}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="Выберите значение"
allowClear
treeDefaultExpandAll
onCha nge={onChange}
>
<TreeNode value="parent1" title="Родитель 1" key="0-1">
<TreeNode value="child1" title="Дитя 1" key="0-1-1" />
<TreeNode value="child2" title="Дитя 2" key="0-1-2" />
</TreeNode>
<TreeNode value="parent2" title="Родитель 2" key="0-2">
<TreeNode value="child3" title="Дитя 3" key="0-2-1" />
</TreeNode>
</TreeSelect>
);
};
Ключевые моменты:
value — текущее выбранное значение (или массив значений
при множественном выборе).onChange — обработчик изменения выбора.allowClear — отображает кнопку очистки.treeDefaultExpandAll — разворачивает все узлы по
умолчанию.dropdownStyle — позволяет задавать стили выпадающего
списка.TreeSelect поддерживает множественный выбор, что делает компонент удобным для фильтров и выбора нескольких категорий.
<TreeSelect
multiple
value={value}
onCha nge={onChange}
treeCheckable={true}
showCheckedStrategy={TreeSelect.SHOW_PARENT}
placeholder="Выберите несколько значений"
style={{ width: 300 }}
>
<TreeNode value="parent1" title="Родитель 1" key="0-1">
<TreeNode value="child1" title="Дитя 1" key="0-1-1" />
<TreeNode value="child2" title="Дитя 2" key="0-1-2" />
</TreeNode>
<TreeNode value="parent2" title="Родитель 2" key="0-2">
<TreeNode value="child3" title="Дитя 3" key="0-2-1" />
</TreeNode>
</TreeSelect>
Особенности множественного выбора:
multiple — включает возможность выбирать несколько
элементов.
treeCheckable — добавляет чекбоксы рядом с
узлами.
showCheckedStrategy — определяет, какие значения
отображаются в поле ввода:
SHOW_PARENT — отображает только родительские узлы, если
все дочерние выбраны.SHOW_CHILD — отображает только выбранные дочерние
узлы.SHOW_ALL — отображает все выбранные узлы.TreeSelect поддерживает асинхронную загрузку данных, что удобно при работе с большими деревьями или API.
<TreeSelect
value={value}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="Выберите значение"
loadData={loadData}
onCha nge={onChange}
treeDefaultExpandAll
>
</TreeSelect>
const loadData = treeNode => {
return new Promise(resolve => {
setTimeout(() => {
treeNode.children = [
{ title: 'Новый узел 1', value: 'new1', key: 'new1' },
{ title: 'Новый узел 2', value: 'new2', key: 'new2' }
];
setTreeData([...treeData]); // обновляем состояние дерева
resolve();
}, 1000);
});
};
Важные моменты:
loadData вызывается только для узлов без дочерних
элементов.TreeSelect поддерживает встроенный поиск, который может работать как по тексту, так и по значению.
<TreeSelect
showSearch
value={value}
style={{ width: 300 }}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="Поиск по узлам"
allowClear
treeDefaultExpandAll
onCha nge={onChange}
filterTreeNode={(inputValue, treeNode) =>
treeNode.title.toLowerCase().includes(inputValue.toLowerCase())
}
/>
Особенности поиска:
showSearch — активирует поле поиска.filterTreeNode — позволяет полностью кастомизировать
алгоритм фильтрации.title или
value, а также комбинировать с другими условиями.TreeSelect легко стилизуется и интегрируется с другими компонентами Ant Design:
title для рендеринга JSX, что позволяет добавлять иконки,
кастомные элементы или дополнительную информацию:<TreeNode
value="parent1"
title={<span style={{ color: 'red' }}>Родитель 1</span>}
key="0-1"
/>
treeExpandedKeys, onTreeExpand позволяют
контролировать, какие узлы открыты:<TreeSelect
treeExpandedKeys={expandedKeys}
onTreeExp and={setExpandedKeys}
/>
key) для всех
узлов, чтобы избежать проблем с перерисовкой.value и
onChange, чтобы компонент был управляемым.loadData, чтобы минимизировать начальную
загрузку.treeCheckable и showCheckedStrategy,
чтобы улучшить UX.filterTreeNode, чтобы расширить возможности
фильтрации.Эти подходы обеспечивают максимальную гибкость и производительность при работе с TreeSelect в реальных приложениях.