将路线与布局的其余部分分开 - 做出反应

Posted

技术标签:

【中文标题】将路线与布局的其余部分分开 - 做出反应【英文标题】:Seperate route from rest of layout - react 【发布时间】:2021-04-15 17:22:31 【问题描述】:

我有一个要添加管理页面的应用程序。我希望管理页面有自己的布局与客户端布局分开。我有什么当前和“最好”的方式来实现这一点?

app.js

import './App.css';
import  BrowserRouter as Router, Route, Switch  from "react-router-dom";
import HomePage from './pages/HomePage';
import ItemDetailPage from './pages/ItemDetailPage';
import Header from './components/Header';
import Footer from './components/Footer';
import CollectionPage from './pages/CollectionPage';
import AdminPage from './pages/AdminPage';

function App() 
  return (
    <Router>
      /* Admin app routes */
        /* <Route exact path="/admin" component=AdminPage/> */
      /* Client app routes */
      <div className="app">
        <Header />
        <Switch>
          <Route exact path="/" component=HomePage/>
          <Route exact path="/item/:itemID" component=ItemDetailPage/>
          <Route exact path="/collections/:collection" component=CollectionPage/>
        </Switch>
        <Footer />
    </div>
    </Router>
    
  );


export default App;

HOC

export default function ClientLayoutHOC(props) 
    const component: Component, ...rest = props;
    return (
        <div className="app">
            <Header />
                /*<Component ...rest/> */
                props.children
            <Footer />
        </div>
    )


我找到了this。我应该创建一个AdminLayoutClientLayout 组件并过滤页面吗?

【问题讨论】:

【参考方案1】:

您可以创建一个高阶组件并将其添加到您的非管理页面,如下所示: HOC 可以包含您的 div 包装器以及页眉和页脚。

那么你所有的路由都在 Router.Switch 中保持干净

下面的 HOC、HomePage、ItemDetailPage 和 CollectionPage 的匿名函数旨在作为您将对这些组件进行更改的示例。 HOC 组件也将是一个单独的组件。

const HOC = (props) => 
    const component: Component, ...rest = props;
    return (
        <div className="app">
            <Header/>
            <Component ...rest/>
            <Footer/>
        </div>
    )


const HomePage = (props) => 
    return (
        <HOC>
            /* replace with HomePage content*/
        </HOC>
    )


const ItemDetailPage = (props) => 
    return (
        <HOC>
            /* replace with ItemDetailPage content*/
        </HOC>
    )


const CollectionPage = (props) => 
    return (
        <HOC>
            /* replace with CollectionPage content*/
        </HOC>
    )


function App() 
    return (
        <Router>
            <Switch>
                /* Admin app routes */
                <Route exact path="/admin" component=AdminPage/>
                /* Client app routes */
                <Route exact path="/" component=HomePage />
                <Route exact path="/item/:itemID" component=ItemDetailPage/>
                <Route exact path="/collections/:collection" component=CollectionPage/>
            </Switch>
        </Router>

    );

在查看您添加的 HOC 代码时,我建议进行以下更改:

export default function ClientLayoutHOC(props) 
    const component: Component, children, ...rest = props;
    return (
        <div className="app">
            <Header />
                <Component ...rest>
                    children
                </Component>
            <Footer />
        </div>
    )

【讨论】:

你能看看我的HOC吗?如果我取消注释它会中断。 改用props.children 我不确定您为组件提供了哪些子项,例如您的示例中的 HomePage、ItemDetailPage 和 CollectionPage 都是具有空“子”属性的 Route 组件。当您的组件以 /> 结尾时,您没有提供孩子。为了有孩子,你需要在组件标记的开始和结束标记之间有标记。例如/*这是您添加孩子的地方*/.

以上是关于将路线与布局的其余部分分开 - 做出反应的主要内容,如果未能解决你的问题,请参考以下文章

将 CSS 部署与站点的其余部分分开

将模型与应用程序的其余部分分开是一种好的编程习惯吗

使用边距/填充将 <span> 与 <p> 的其余部分隔开

ADT OOP

Laravel 除了 '/' 之外的所有路由都返回 404

恢复通过 websocket 发送的数据