这个 Codesandbox Reactjs 应用 MainLayout 是如何工作的

Posted

技术标签:

【中文标题】这个 Codesandbox Reactjs 应用 MainLayout 是如何工作的【英文标题】:How does this Codesandbox Reactjs app MainLayout work 【发布时间】:2021-03-15 10:57:51 【问题描述】:

我学习了 React 并阅读了大量代码,现在我看到 this Codesandbox 并且无法理解为什么有两个 Main Layout 都带有 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;

你有DashboardLayoutMainLayout,当应用程序启动时,我看到MainLayout首先呈现,默认路由是&lt;Navigate to="/app/dashboard" /&gt;,那就是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】:

这是模板布局中的常见模式,通常是良好的设计实践。使用它的主要原因是用于经过身份验证/未经身份验证的路由(即登录与未登录)。您会注意到两种布局的 topbar.js 完全不同。

对于主布局,这是您未经身份验证的布局,它是您可以显示主页、关于页面等的地方,您希望任何人都可以访问。有了这个,你可能不想显示通常的导航项目,比如个人资料链接等。你当然可以在 React 中使用 state 来做到这一点,但后一种方式更整洁,你不必有其他在应用路径下未经身份验证而运行的可能复杂的代码。

仪表板布局通常用作经过身份验证的路径。这可能是公司的后端管理部分或其他网络应用程序。

这样的模板通常提供足够的分离,以便开发人员可以在应用中实现自己的身份验证和后端功能,但仍然可以看到所有已创建组件的预期设计路径。

【讨论】:

以上是关于这个 Codesandbox Reactjs 应用 MainLayout 是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ReactJs 中制作步骤向导表单?

Reactjs下拉菜单悬停在单词上时不显示

Reactjs 光滑的幻灯片

如何处理错误 - Codesandbox 的 React 应用程序中的“无法获取”

reactjs错误-onChange不是函数错误

ReactJS - 状态数组中的重复对象保持链接