Я пытаюсь реализовать клавиатурную навигацию по списку с помощью реагирующих хуков.
важный - Этот список может уменьшаться / увеличиваться в зависимости от результатов поиска.
Моя проблема связана с клавишей Enter
, которая должна запускать некоторый обратный вызов.
activeCursor
не меняется, что я понимаю, поскольку его нет в массиве useEffect
, но как я могу получить текущее состояние внутри handleKeyPress
без необходимости повторного запуска useEffect
?
Кроме того, в идеале я бы хотел запускать свой useEffect
только при монтировании ([]
), но, поскольку filteredMessages
изменился, я должен перезвонить, что также странно, поскольку его eventListeners
так Я даже не уверен, что с ними происходит каждый раз ...
const useKeyboardNavigation = (filteredMessages, onMessageSelection) => {
const [activeCursor, setActiveCursor] = React.useState(0);
const size = filteredMessages.length
const handleKeyPress = (event) => {
if (event.key === 'ArrowDown') {
setActiveCursor(prev => prev < size ? prev + 1 : 0)
}
else if (event.key === 'ArrowUp') {
setActiveCursor(prev => prev > 0 ? prev - 1 : size)
}
else if (event.key === 'Enter') {
const msg = filteredMessages[activeCursor] // ??? Always 0
onMessageSelection(msg)
}
};
React.useEffect(
() => {
// Each time the list changes I reset the cursor
setActiveCursor(0)
document.addEventListener('keydown', handleKeyPress);
return () => document.removeEventListener('keydown', handleKeyPress);
},
[filteredMessages]
);
return [activeCursor, setActiveCursor];
}