Вот рендеринг списка — я явно перечислил каждый элемент вместо использования функции карты, чтобы иметь возможность правильно назначать ссылки:
Код: Выделить всё
{listItems ? [list] setListItems(null)} ref={suggestionRef}>
{listItems[0] ? [*] handleSelect(listItems[0].text)}
onKeyDown={e=> handleNav(e, listItems[0].text, 1, listItems.length, suggestion2, suggestion1)}
role='option' ref={suggestion0}> {listItems[0].text} : null}
{listItems[1] ? [*] handleSelect(listItems[1].text)}
onKeyDown={e=> handleNav(e, listItems[1].text, 2, listItems.length, suggestion0, suggestion2)}
role='option' ref={suggestion1}> {listItems[1].text} : null}
{listItems[2] ? [*] handleSelect(listItems[2].text)}
onKeyDown={e=> handleNav(e, listItems[2].text, 3, listItems.length, suggestion1, suggestion0)}
role='option' ref={suggestion2}> {listItems[2].text} : null}
[/list] : null}
Код: Выделить всё
const suggestionRef = useRef(null);
const suggestion0 = useRef(null);
const suggestion1 = useRef(null);
const suggestion2 = useRef(null);
Код: Выделить всё
const handleKeyDown = (event) => {
if (listItems && event.key === 'ArrowDown') {
event.preventDefault();
if (suggestion0.current) {
suggestion0.current.focus();
}
}
}
Код: Выделить всё
const handleNav = (event, text, index, maxLength, refBefore, refAfter) => {
if (event.key === 'Enter') {
event.preventDefault();
handleSuggestSelect(text);
}
else if (event.key === 'ArrowDown'){
event.preventDefault();
if (index == maxLength) { //back to beginning
if (suggestion0.current) {
suggestion0.current.focus();
}
} else {
if (refAfter.current) {
console.log(refAfter)
refAfter.current.focus();
}
}
}
else if (event.key === 'ArrowUp'){
event.preventDefault();
if (index == 1) {
if (suggestion2.current) { //down to the end - have to work this out differently if there are only two items in list
console.log(suggestion2)
suggestion2.current.focus();
}
} else {
if (refBefore.current) {
console.log(refBefore)
refBefore.current.focus();
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... using-refs