javascript - 如何使用 React 中的 Hooks 在带有汉堡菜单的标题中切换侧边栏组件
问题描述
我是 React 的新手,也许有人可以帮助我。我想用 Hooks 在我的 Header 组件中切换我的侧边栏。
这是我的代码:
Sidebar.js
...imported things
...styles
export const SideBar = () => {
const history = useHistory();
return (
<StyledSideBar>
<Tooltip title="Dashboard" placement="right" arrow >
<StyledButton onClick={() => history.push('/dashboard')}>
<FontAwesomeIcon icon={faTachometerAltFast} />
</StyledButton>
</Tooltip >
<Tooltip title="Chat" placement="right" arrow>
<StyledButton onClick={() => history.push('/chat')}>
<FontAwesomeIcon icon={faCommentsAlt} />
</StyledButton>
</Tooltip>
<Tooltip title="Calendar" placement="right" arrow>
<StyledButton onClick={() => history.push('/calendar')}>
<FontAwesomeIcon icon={faCalendarAlt} />
</StyledButton>
</Tooltip>
</StyledSideBar>
);
}
export default SideBar;
页眉.js
...imported things
...styles
import SideBar from '../sidebar';
export const MainHeader = () => {
const [show, setShow] = React.useState(false);
const toggle = () => setShow(!show);
return (
<AppBar elevation={2} position="sticky" color="inherit" >
<FlexToolbar variant="regular">
<StyledMenuIcon open={show} onClick={toggle.{SideBar}>
<FontAwesomeIcon icon={faBars} />
</StyledMenuIcon>
<Logo src="/assets/images/logo.svg" alt="Vetera Sky" />
<BreakpointLogo src="/assets/images/get-started-icon.svg" alt="Vetera Sky" />
<Spacer />
<LogoutButton onClick={onLogout}>
<FontAwesomeIcon icon={faPowerOff} />
<Typography variant="label" color={actionSecondary}>Logout</Typography>
</LogoutButton>
<BreakpointLogoutButton onClick={onLogout}>
<FontAwesomeIcon icon={faPowerOff} />
</BreakpointLogoutButton>
</FlexToolbar>
</AppBar>
)};
export default MainHeader;
我知道这是错误的,但我在网上或这里找不到任何东西。如果单击 StyledMenuIcon 一次,侧边栏应该在左侧打开,如果再次单击它应该关闭。
希望有人能尽快帮助我:)
解决方案
您应该在 MainHeader 和 SideBar 组件都可以使用它的树中将您的状态向上移动:
function App() {
const [showSidebar, setShowSidebar] = useState(false);
const onToggleSidebar = () => {
setShowSidebar(!showSidebar);
};
return (
<MainHeader onToggleSidebar={onToggleSidebar} />
<SideBar open={showSidebar}
);
}
如果组件在树中的同一级别上不可用,您可以使用 React 的上下文 api 从树的不同位置使用此逻辑。
或者,如果您已经在使用 redux 或其他状态管理系统,您可以将您的应用程序状态移到那里。
推荐阅读
- python - 如果单词遵循特定模式,则删除 pandas 列中单词中的字母
- binding - 将静态库绑定到 Xamarin.iOS 时找不到 CGImageRef
- google-chrome - WebGL (2.0) 画布在线性色彩空间中与 HTML 混合
- computational-geometry - CGAL:有没有办法连接来自不同表面的两条边?
- javascript - 相对位置有限的 div 内可能有 100% 的屏幕宽度吗?
- sql - 如何为日期范围的每个日期返回包含非空值的所有 ID?
- apache-spark - Kafka 使用 PySpark 创建DirectStream
- gradle - Gradle Kotlin DSL:如何使用 typesafe api 配置子项目
- android-studio - 反向编码Android apk,但获得的音乐文件不起作用
- matrix - 将 Mathematica 中的矩阵导出到 Maple 2019