Я пытаюсь имитировать поведение, подобное нажатию на оверлей, когда открыто модальное всплывающее окно. При нажатии за пределами компонента sidenav я хочу закрыть все элементы, которые в настоящее время находятся в режиме flyout
.
У меня есть многоуровневое вложенное меню навигации, которое хранится в собственном компоненте Sidebar
. У меня есть следующий фрагмент кода, который обрабатывает clicks
, возникающие вне компонента Sidebar
:
class Sidebar extends React.Component {
...
handleClick = (e) => {
if (this.node.contains(e.target)) {
return;
}
console.log('outside');
};
componentDidMount() {
window.addEventListener('mousedown', this.handleClick, false);
}
componentWillUnmount() {
window.removeEventListener('mousedown', this.handleClick, false);
}
render() {
return (
<div
ref={node => this.node = node}
className="sidebar"
data-color={this.props.bgColor}
data-active-color={this.props.activeColor}
>
{renderSideBar()}
</div>
);
}
...
}
Эта часть работает нормально, но когда всплывающие меню отображаются при нажатии на опцию родительского меню, я хотел бы, чтобы он закрыл -любые- всплывающие меню, которые в настоящее время открыты.
-|
|
- Menu Item 1
|
|-option 1 (currently open)
|-option 2
- Menu Item 2
|
|-option 1 (closed)
|-option 2 (closed, clicked to expand - this is when it should close [Menu Item 1/Option 1]
Пункты меню создаются с использованием тегов <li>
при сопоставлении объекта данных, содержащего структуру меню.
Есть ли способ в основном выбрать все зарегистрированные объекты, которые имеют класс 'collapse' / aria-extended = "true", и удалить его? Подобно тому, как jQuery
будет выбирать элементы dom и манипулировать ими.
Я знаю, что это не предпосылка, в которой работает React, это просто пример поведения, которое я хочу имитировать.