如何在单个路由中同时使用Layout与AuthProvider?
解决方案
你可以通过两种方式实现仅在指定路由(比如/home)同时使用AuthProvider和Layout:
方法一:直接在目标路由中嵌套Layout
把Home组件放在Layout内部作为子内容,这样/home路由就会同时处于AuthProvider的上下文和Layout的包裹中:
修改路由代码:
export const Routers: FC = () => { return ( <BrowserRouter> <Routes> <Route path="/" element={<AuthProvider />}> {/* 将Home组件嵌套进Layout */} <Route path="/home" element={<Layout><div>Home</div></Layout>} /> </Route> <Route path="/auth" element={<Auth />} /> <Route path="*" element={<ErrorPage message="Страница не найдена!" status={404} />} /> </Routes> </BrowserRouter> ) }
方法二:新增路由层级,用Layout作为父组件
如果之后有多个路由需要复用Layout,可以在AuthProvider下新增一层路由,让Layout作为父组件(需确保Layout内部包含Outlet),所有子路由会自动继承Layout:
- 先给Layout添加Outlet:
export const Layout: FC = () => { return ( <div className="layout-wrapper"> {/* 侧边栏区域 */} <aside>侧边栏内容</aside> {/* 子路由渲染区域 */} <main><Outlet /></main> </div> ) }
- 调整路由结构:
export const Routers: FC = () => { return ( <BrowserRouter> <Routes> <Route path="/" element={<AuthProvider />}> {/* 新增Layout作为父路由 */} <Route element={<Layout />}> <Route path="/home" element={<div>Home</div>} /> {/* 后续需要Layout的路由都可以放在这个层级下 */} </Route> </Route> <Route path="/auth" element={<Auth />} /> <Route path="*" element={<ErrorPage message="Страница не найдена!" status={404} />} /> </Routes> </BrowserRouter> ) }
两种方法都能满足需求:方法一更直接,适合单个路由的场景;方法二更灵活,适合多个路由共享Layout的情况。
内容的提问来源于stack exchange,提问作者Pavel Chalov
相关产品推荐
相关产品推荐

