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

kr98yfug  于 2023-06-05  发布在  React
关注(0)|答案(1)|浏览(182)

我学习了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;

在那里你有DashboardLayoutMainLayout,当应用程序启动时,我看到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)有关?

qojgxg4l

qojgxg4l1#

这是模板布局中的一种常见模式,通常是良好的设计实践。使用它的主要原因是用于经过身份验证/未经身份验证的路由(即登录与未登录)。你会注意到两种布局的topbar.js非常不同。
对于主布局,这是您未经验证的布局,它是您可以显示主页,关于页面等的地方。你希望任何人都能接触到它有了这个,你可能不想显示通常的导航项,如个人资料链接等。当然,你可以在React中使用state来实现这一点,但后者更整洁,而且你不必在应用路径下运行其他潜在复杂的代码。
Jmeter 板布局通常用作身份验证路径。这可能是公司的后端管理部分或其他web应用程序。
像这样的模板通常提供足够的分离,这样开发人员就可以在应用程序中实现自己的身份验证和后端功能,但仍然可以看到所有已经创建的组件的预期设计路径。

相关问题