Я создал компонент меню и пытаюсь использовать ловушку useState для хранения открытых подменю. Когда меню закрыто (от родителя, использующего реквизиты), я хочу закрыть все подменю, и для этого я использую хук usePrevious из библиотеки react-hanger, чтобы определить, когда главное меню переходит из OPEN> CLOSED. Вот мой код.
import React, { useState } from 'react';
import { usePrevious } from "react-hanger"
const defaultMenusOpen = {menu1:false, menu2:false}
function Menu(props) {
const [subMenusOpen, setSubMenusOpen] = useState(defaultMenusOpen))
const prevIsOpen = usePrevious(props.isOpen);
if(props.isOpen === false && prevIsOpen === true){
setSubMenusOpen(defaultMenusOpen)
}
return (
{props.isOpen &&
... JSX
}
);
}
export default Menu
Проблема в том, что это вызывает ошибку бесконечного цикла и постоянное повторное отображение меню.
Похоже, это связано с тем, что оператор if имеет значение TRUE при каждом повторном рендеринге, потому что вызов setSubMenusOpen, похоже, не заставляет usePrevious снова сохранять новое значение. Я думаю, вот что происходит.
- props.is: открыть изменения с ИСТИНА> ЛОЖЬ
- prevIsOpen и props.isOpen в этот момент имеют значения TRUE и FALSE, поэтому ...
- setSubMenusOpen () вызывает повторный рендеринг.
- Вместо previsOpen и props.isOpen, которые теперь имеют значение FALSE и FALSE, они остаются неизменными, поэтому setSubMenusOpen вызывается снова, ad finitum
Любая помощь будет принята с благодарностью.