useListState — это хук из библиотеки React
Aria, предназначенный для управления состоянием списков в
компонентах пользовательского интерфейса. Он обеспечивает абстракцию над
сложной логикой выбора, фильтрации и организации элементов списка,
позволяя сосредоточиться на рендеринге и взаимодействии с
пользователем.
useListStateВыбор элементов (selection) Хук поддерживает разные режимы выбора:
Выбор управляется через объект selectionState, который
возвращает хук.
Фильтрация элементов (filtering) Состояние
списка может быть динамически отфильтровано на основе строки поиска или
других условий. useListState автоматически обновляет список
видимых элементов, сохраняя корректность индексов и ключей.
Поддержка виртуализации (virtualization) Для длинных списков хук может использоваться совместно с компонентами виртуализации, так как возвращает полностью управляемый массив элементов с их состояниями, включая выделение и фокус.
Управление фокусом (focus management) Хук хранит
индекс текущего фокусированного элемента, обеспечивая корректное
взаимодействие с клавиатурой. Методы setFocusedKey и
isFocused позволяют синхронизировать фокус с DOM.
import { useListState } from '@react-stately/list';
const listState = useListState({
selectionMode: 'multiple', // режим выбора: single | multiple | none
initialSelectedKeys: ['item1'], // начально выбранные элементы
items: [
{ id: 'item1', name: 'Первый элемент' },
{ id: 'item2', name: 'Второй элемент' },
{ id: 'item3', name: 'Третий элемент' }
]
});
useListState возвращает объект, содержащий:
isSelected, toggleKey,
replaceSelection, clearSelection.listState.selectionManager.isSelected('item2'); // true/false
listState.selectionManager.toggleKey('item2'); // переключение состояния выбора
listState.selectionManager.replaceSelection('item3'); // замена текущего выбора
listState.selectionManager.clearSelection(); // очистка выбора
useListState автоматически учитывает модификаторы клавиш
при работе с элементами списка:
useListState хранит focusedKey и
предоставляет методы для управления фокусом:
listState.setFocusedKey('item2'); // перемещение фокуса
const isFocused = listState.focusedKey === 'item2';
Фокус используется совместно с useListBox или любым
кастомным компонентом для визуального выделения активного элемента и
управления навигацией с клавиатуры.
Объект collection возвращает полную структуру элементов, включая ключи и пользовательские данные:
listState.collection.forEach(item => {
console.log(item.key, item.props.name);
});
Это позволяет легко рендерить список через map, сохраняя
согласованность состояния выбора и фокуса.
useListState поддерживает изменение списка элементов
после инициализации:
listState.items = [
{ id: 'item1', name: 'Первый элемент' },
{ id: 'item4', name: 'Новый элемент' }
];
Хук автоматически обновляет:
useListState часто используется совместно с
компонентами:
useListBox — для рендеринга списка с
поддержкой клавиатуры и WAI-ARIA атрибутов.useOption — для отдельного элемента
списка, синхронизированного с selectionManager.useComboBox / useMenu —
для управления состоянием выпадающих списков и автокомплита.Пример интеграции с useListBox:
import { useListBox } from '@react-aria/listbox';
function ListBox({ state }) {
const ref = React.useRef();
const { listBoxProps } = useListBox({ selectionMode: state.selectionMode }, state, ref);
return (
<ul {...listBoxProps} ref={ref}>
{[...state.collection].map(item => (
<Option key={item.key} item={item} state={state} />
))}
</ul>
);
}
useListStateuseListBox, useOption,
useComboBox).useListState является ядром управления состоянием
списков в React Aria, позволяя строить сложные интерактивные компоненты
с минимальной ручной логикой, соблюдая при этом стандарты
доступности.