Чтобы достичь чего-то подобного, вы должны установить эту логику c в общем родительском элементе обоих компонентов (здесь App
для примера).
App
будет управлять состоянием, чтобы определить, Nav
открыт или нет. Состояние называется isMenuOpen
и может быть изменено с помощью функции setIsMenuOpen()
. Мы дадим детям Nav
состояние isMenuOpen
и детям TopBar
обратный вызов из функции setIsMenuOpen()
:
App.jsx
import React from "react";
import TopBar from "./TopBar";
import Nav from "./Nav";
export default function App() {
const [isMenuOpen, setIsMenuOpen] = React.useState(false);
return (
<div className="App">
<TopBar setMenuStatus={setIsMenuOpen} />
<Nav isOpen={isMenuOpen} />
</div>
);
}
Затем TopBar
необходимо установить значение isMenuOpen
в true
, используя функцию setIsMenuOpen()
из реквизита.
TopBar.jsx
import React from "react";
export default function Topbar({ setMenuStatus }) {
return (
<div className="topbar__container">
<div className="topbar__menuButton">
<button
type="button"
onClick={() => {
setMenuStatus(true);
}}
>
Menu
</button>
</div>
</div>
);
}
Тогда компонент Nav
установит определенный c класс (здесь .open
), если isOpen
поступает из Реквизиты true
.
Nav.jsx
import React from "react";
import "./styles.css";
export default function Nav({ isOpen }) {
return (
<div id="nav" className={isOpen ? "open" : ""}>
Menu
</div>
);
}
стилей. css
#nav {
display: none;
}
#nav.open {
height: 400px;
display: inline-block;
}
Вы можете попробовать этот пример в этом codesandbox .