我学习了React并阅读了大量代码,现在我看到了this Codesandbox,无法理解为什么有两个主布局都带有ToolBar
基本上看起来像这样:
路由:
const routes = [
{
path: 'app',
element: <DashboardLayout />,
children: [
{ path: 'account', element: <AccountView /> },
{ path: 'customers', element: <CustomerListView /> },
{ path: 'dashboard', element: <DashboardView /> },
{ path: 'products', element: <ProductListView /> },
{ path: 'settings', element: <SettingsView /> },
{ path: '*', element: <Navigate to="/404" /> }
]
},
{
path: '/',
element: <MainLayout />,
children: [
{ path: 'login', element: <LoginView /> },
{ path: 'register', element: <RegisterView /> },
{ path: '404', element: <NotFoundView /> },
{ path: '/', element: <Navigate to="/app/dashboard" /> },
{ path: '*', element: <Navigate to="/404" /> }
]
}
];
export default routes;
在那里你有DashboardLayout
和MainLayout
,当应用程序启动时,我看到MainLayout
首先呈现,默认路由是<Navigate to="/app/dashboard" />
,这是DashboardLayout
。
在查看MainLayout
的代码时,我看到了与DashboardLayout
相同的代码镜像:
喜欢MainLayout
:
const useStyles = makeStyles((theme) => ({
root: {
backgroundColor: theme.palette.background.default,
display: 'flex',
height: '100%',
overflow: 'hidden',
width: '100%'
},
wrapper: {
display: 'flex',
flex: '1 1 auto',
overflow: 'hidden',
paddingTop: 64
},
contentContainer: {
display: 'flex',
flex: '1 1 auto',
overflow: 'hidden'
},
content: {
flex: '1 1 auto',
height: '100%',
overflow: 'auto'
}
}));
const MainLayout = () => {
const classes = useStyles();
return (
<div className={classes.root}>
<TopBar />
<div className={classes.wrapper}>
<div className={classes.contentContainer}>
<div className={classes.content}>
<Outlet />
</div>
</div>
</div>
</div>
);
};
export default MainLayout;
喜欢DashboardLayout
:
const useStyles = makeStyles((theme) => ({
root: {
backgroundColor: theme.palette.background.dark,
display: 'flex',
height: '100%',
overflow: 'hidden',
width: '100%'
},
wrapper: {
display: 'flex',
flex: '1 1 auto',
overflow: 'hidden',
paddingTop: 64,
[theme.breakpoints.up('lg')]: {
paddingLeft: 256
}
},
contentContainer: {
display: 'flex',
flex: '1 1 auto',
overflow: 'hidden'
},
content: {
flex: '1 1 auto',
height: '100%',
overflow: 'auto'
}
}));
const DashboardLayout = () => {
const classes = useStyles();
const [isMobileNavOpen, setMobileNavOpen] = useState(false);
return (
<div className={classes.root}>
<TopBar onMobileNavOpen={() => setMobileNavOpen(true)} />
<NavBar
onMobileClose={() => setMobileNavOpen(false)}
openMobile={isMobileNavOpen}
/>
<div className={classes.wrapper}>
<div className={classes.contentContainer}>
<div className={classes.content}>
<Outlet />
</div>
</div>
</div>
</div>
);
};
export default DashboardLayout;
这样做的好处是什么?我的意思是,MainLayout
是出于什么原因渲染的?这是否与useRoutes
元素结构(如分组路由element
)有关?
1条答案
按热度按时间qojgxg4l1#
这是模板布局中的一种常见模式,通常是良好的设计实践。使用它的主要原因是用于经过身份验证/未经身份验证的路由(即登录与未登录)。你会注意到两种布局的topbar.js非常不同。
对于主布局,这是您未经验证的布局,它是您可以显示主页,关于页面等的地方。你希望任何人都能接触到它有了这个,你可能不想显示通常的导航项,如个人资料链接等。当然,你可以在React中使用state来实现这一点,但后者更整洁,而且你不必在应用路径下运行其他潜在复杂的代码。
Jmeter 板布局通常用作身份验证路径。这可能是公司的后端管理部分或其他web应用程序。
像这样的模板通常提供足够的分离,这样开发人员就可以在应用程序中实现自己的身份验证和后端功能,但仍然可以看到所有已经创建的组件的预期设计路径。