javascript - 控制响应式布局的侧边栏并根据 React.js 中的当前路由更新标题组件
问题描述
我在 React 和 RN 方面有两年的经验,但这是我第一次必须从头开始规划 Web 应用程序。
这是布局的样子:
以及 App.js 的结构。稍后我将添加 Redux 或其他商店提供程序。
function App() {
const [isMobile, setIsMobile] = useState(false);
const width = useWindowWidth();
useEffect(() => {
setIsMobile(width < theme.mobileWidthLimit);
}, [width]);
return (
<ThemeProvider theme={{ isMobile, ...theme }}>
<BrowserRouter>
<Layout isMobile={ isMobile }>
<Pages/>
</Layout>
</BrowserRouter>
</ThemeProvider>
);
}
我正在决定窗口是否对于桌面 UI 来说太窄,并基于此我将 isMobile 道具传递给 Styled Components 的主题提供者以及主布局。
这是我的布局:
const Layout = ({ children, isMobile }) => {
const [sideBarOpen, setSideBarOpen] = useState(!isMobile);
// Navigation side bar will be closed when user navigates
const location = useLocation();
useEffect(() => setSideBarOpen(false), [location.key]);
// TODO improve title updation
const title = ((path) => {
switch (path) {
case '/trip':
return 'Your trips';
case '/trip/new':
return 'New trip';
default:
return 'View trip';
}
})(location.pathname);
return (
<OuterDiv>
<MenuButton onClick={ () => setSideBarOpen(!sideBarOpen) }/>
<NavSideBar isOpen={ sideBarOpen }/>
<InnerDiv isClosed={ sideBarOpen }>
<Header>
<h1>{ title }</h1>
</Header>
<Content>
{ children }
</Content>
</InnerDiv>
{ !isMobile && <InfoSideBar/> }
</OuterDiv>
);
};
以下是基于 isMobile 和 sideBarOpen 的侧边栏和内容如何相互替换。
侧边栏:
display: ${(props) => props.theme.isMobile && !props.isOpen ? 'none' : 'flex'};
内部 div(包装内容和标题):
display: ${(props) => (props.theme.isMobile && props.isClosed) ? 'none' : 'flex' };
我希望我设法让您对应用程序的外观有一个很好的总体了解。现在,困扰我的两件事是:
侧边栏是否可见取决于 isMobile 和 sideBarOpen。我认为我用 isMobile 所做的是一个可靠且良好的解决方案,但我觉得 setSideBarOpen 可以简化。当用户点击汉堡菜单按钮时,我将其值更改为与其当前值相反的值,并在尝试在应用程序内导航时分配一个错误值。当用户点击侧边栏菜单中的链接时,我找不到更好的方法来关闭菜单。React Router 会检测到更改,应用程序也会检测到更改。可以改进吗?
我使用 switch case 语句更新标题,根据反应路由器的当前路径推断它将是什么。必须有更好的方法来做到这一点,对吧?请注意,标头位于 react-router 的 BrowserRouter 组件之外。
解决方案
推荐阅读
- excel - 使用 .Find 引用单元格时未设置对象变量或 With 块变量
- android - 如何在布局 xml 中设置 `state_selected`?
- python - Python中的字符串关键字搜索
- javascript - 音频播放完毕后更改 CSS 属性
- c++ - 如何判断路径是文件还是没有提升权限的目录
- vue.js - 使用 Nuxt 动态获取和编译模板
- php - json编码的php数组在坐标变量输出周围环绕引号
- java - 游戏的Java循环
- html - 使用选择大小功能控制下拉长菜单的问题
- ios - 使用 ImagePicker 将图片上传到 CollectionView