React Aria предоставляет набор хуков и утилит для управления доступностью интерактивных компонентов. Для работы с выделением строк в списках, таблицах или коллекциях используется комбинация хуков useSelectableCollection, useSelectableItem и useListState. Эти инструменты позволяют управлять состоянием выделения, фокусом и поддержкой клавиатурной навигации.
useListState формирует состояние коллекции элементов, поддерживая операции выделения:
import { useListState } from '@react-stately/list';
const listState = useListState({
selectionMode: 'multiple', // 'single' или 'multiple'
initialSelectedKeys: ['1', '3'],
items: [
{ id: '1', name: 'Элемент 1' },
{ id: '2', name: 'Элемент 2' },
{ id: '3', name: 'Элемент 3' }
]
});
Ключевые параметры:
single или multiple).useSelectableCollection предоставляет контекст для всей коллекции и позволяет интегрировать клавиатурные события и фокусировку:
import { useSelectableCollection } from '@react-aria/selection';
const collectionProps = useSelectableCollection(
{ selectionMode: 'multiple', disabledKeys: new Set(['2']) },
listState,
ref
);
Основные возможности:
ArrowUp,
ArrowDown, Home, End.useSelectableItem применяется на уровне каждой строки, чтобы управлять её состоянием выделения и фокусом:
import { useSelectableItem } from '@react-aria/selection';
const { itemProps, isSelected, isDisabled } = useSelectableItem(
{ key: item.id },
listState,
ref
);
function Row({ item, state }) {
const ref = React.useRef();
const { itemProps, isSelected } = useSelectableItem({ key: item.id }, state, ref);
return (
<div
{...itemProps}
ref={ref}
style={{
backgroundColor: isSelected ? '#D0E1FF' : 'transparent',
padding: '8px',
cursor: 'pointer'
}}
>
{item.name}
</div>
);
}
Элементы автоматически получают доступность через атрибуты
aria-selected и role="option" для списков, что
полностью соответствует требованиям WCAG.
function List({ items }) {
const ref = React.useRef();
const state = useListState({ items, selectionMode: 'multiple' });
const { collectionProps } = useSelectableCollection({ selectionMode: 'multiple' }, state, ref);
return (
<div {...collectionProps} ref={ref} role="listbox">
{items.map(item => <Row key={item.id} item={item} state={state} />)}
</div>
);
}
Особенности работы коллекции:
state.selectedKeys.React Aria автоматически управляет следующими сценариями:
Каждый элемент получает атрибут aria-selected, что позволяет вспомогательным технологиям корректно интерпретировать состояние выделения.
Можно расширять функциональность:
disabledKeys.state.setFocusedKey(key).Использование React Aria для выделения строк обеспечивает:
Это позволяет создавать интерактивные компоненты с соблюдением стандартов доступности и минимальной дополнительной логики.