Первая ошибка: onMouseEnter
и onMouseLeave
ожидали объявления функции вместо вызова, потому что вы вызываете handleOpen(index)
, она перерисовывается, затем перерисовывается снова и так далее. .. чтобы исправить ошибку:
onMouseEnter={(e) => handleOpen(index)}
Вторая ошибка :
<NavDropdown.Item href={element.url} key={element.id} onClick={handleClose}>
это вызовет handleClose с событием, ожидаемым index
, для исправления :
onClick={e => handleClose(index) }
Третья ошибка : ваши handleClose и handleOpen обновляют состояние со ссылкой на старое состояние, ожидается новый массив, чтобы исправить:
const handleOpen = index => {
let temp = [...isOpen];
temp[index] = true;
setIsOpen(temp);
};
const handleClose = index => {
let temp = [...isOpen];
temp[index] = false;
setIsOpen(temp);
};
Кроме того, ваше isOpen
имя неоднозначно, и неправильная инициализация тоже!
const [isOpen, setIsOpen] = useState(() => {
return Array.apply(null, Array(MENU.length)).map(x => false);
});
должно быть
const [status, setStatus] = useState(MENU.map(x=> false));
В целом вы можете написать так:
const updateStatus = (value, index) => {
const clone = [...status];
clone[index] = value;
setStatus(clone);
}
<NavDropdown
onMouseEnter={e => updateStatus(true, index)}
onMouseLeave={e => updateStatus(false, index)}
show={status[index]}
title={item.title}
id={item.id}
key={item.id}
>
{item.sub.map(element =>
<NavDropdown.Item
href={element.url}
key={element.id}
onClick={e => updateStatus(false, index)}
>
{element.item}
</NavDropdown.Item>
)}
</NavDropdown>