reactjs - React Router 每页布局不同
问题描述
我将页眉和页脚组件的布局命名为MainLayout
. 此布局在Home
页面中使用。
我想制作另一个名为SubLayout
. 这没有标题组件,并在About
页面中使用。
如何制作2种不同的布局?
这是我到目前为止尝试过的。
路由器.js
import React from 'react'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import MainLayout from '../components/layouts/MainLayout'
import Home from '../views/home/Home'
import About from '../views/about/About'
export default function Router1() {
return (
<Router>
<Switch>
<Route>
<MainLayout>
<Switch>
<Route path='/' exact component={Home} />
<Route path='/about' component={About} />
</Switch>
</MainLayout>
</Route>
</Switch>
</Router>
)
}
主布局
import React from 'react'
import Header from '../../components/layouts/Header'
import Footer from '../../components/layouts/Footer'
export default function Layout({ children }) {
return (
<div className="wrapper">
<Header />
<div className="container">
<div className="content">
{children}
</div>
</div>
<Footer />
</div>
)
}
子布局.js
import React from 'react'
import Footer from '../../components/layouts/Footer'
export default function Layout({ children }) {
return (
<div className="wrapper">
<div className="container">
<div className="content">
{children}
</div>
</div>
<Footer />
</div>
)
}
解决方案
这不是一个微不足道的问题,并且发生在很多网站上,尤其是在您拥有相当多的页面之后。
解决方案 1
编写布局MainLayout
很困难,因为从现在开始您基本上必须修复该网站的所有可能情况,这是一个挑战。
为了避免这种情况,您可以为每个页面设置一个单独的布局组件。前任。
export default function Page1() {
return (
<Header />
<YourPage1Content />
)
}
虽然这对每个页面都有一些额外的工作,但它非常灵活。无论您要支持多少页面(或功能或站点),该解决方案都具有高度可扩展性。例如,如果您想要特定页面,您甚至可以使用完全不同的标题进行连接。
解决方案 2
如果您正在寻找解决此问题的通用方法并且仍然想要一个,MainLayout
因为这是每个页面的包装器,它可以通过Context
.
export default function MainLayout() {
const { hideHeader } = useContext(LayoutContext)
return (
<>
{!hideHeader && <Header />}
{children}
</>
)
将context
通过路线或任何Context.Provider
可以在您App.js
或index.js
例如对于特定路线,
export default function MainLayout() {
const location = useLocation()
const hideHeader = location.pathname === '/'
return (
<>
{!hideHeader && <Header />}
{children}
</>
)
这种方法非常通用且具有高度可扩展性,只要context
对整个站点使用相同的方法即可。
概括
如果您不知道您正在构建哪个站点,请使用解决方案 1,它可以满足任何要求。但是,如果您有特定的需求,解决方案 2 非常适合确保您可以使用通用Layout
组件。
Layout
总而言之,这与您想要重用多少组件有关。
推荐阅读
- c - 如果满足某个条件,则定义一个结构
- python - 如何在熊猫中将逗号分隔值转换为整数
- python - 如何在 windows powershell 中安装 virtualenv
- python-3.x - 为什么我的附加列表被覆盖我的意思是前面的附加元素正在改变?我能知道为什么
- autosys - Python Autosys 自动化
- node.js - Bull Queue如何进行无限尝试?
- reactjs - Serviceworker - WorkBox v3.5 在 CRA 中“找不到注入清单的地方”
- r - 不再工作的闪亮应用程序
- math - 试图理解涉及 O(M+N) 的渐近案例
- laravel - 如何激活从控制器传递数据到视图的模式。(拉拉维尔)