【问题标题】:How to use display different menu based on different react router path如何根据不同的反应路由器路径使用显示不同的菜单
【发布时间】:2020-02-03 13:49:31
【问题描述】:

我正在处理一个 React 项目,我的站点主页带有默认导航栏,但我希望站点仪表板具有与站点其他页面不同的导航栏。

我尝试创建 2 个 <Layout> components 来带孩子并显示不同的导航栏。然后我根据我想要显示的导航栏用它们包装我的组件。但是 react-router 有这个问题。以下是我的代码:

<>
      <Switch>

        <Route exact path="/admin/login" component={ Login } />

        <Dashboard>
          <Route exact path="/admin/dashboard/" component={ DashboardHome } />
          <Route exact path="/admin/dashboard/about" component={ AboutForm } />
          <Route exact path="/admin/dashboard/properties" component={ Allproperties } />
          <Route exact path="/admin/dashboard/contact" component={ ContactFrom } />
          <Route exact path="/admin/dashboard/newproperty" component={ Newproperty } />
          {/* <Route exact path="/admin/dashboard/messages" component={ Messages } /> */}
        </Dashboard>

        <Layout>
          <Route exact path="/" component={ Home } /> 
          <Route exact path="/properties/" component={ Properties } />
          <Route exact path="/services/" component={ Services } />
          <Route exact path="/contact/" component={ ContactMe } />
          <Route exact path="/property/:slug" component={ SingleProperty } />
          <Route component={ Errors } />
        </Layout>

      </Switch>
    </>

Layout组件的代码:

import React from 'react';

// components
import Navbar from './Navbar'

const Layout = ({children}) => {
    return (
        <>
            <Navbar />
            {children}
        </>
    );

}

export default Layout;

仪表板布局组件的代码:

import React, { Component } from 'react'
import { Link } from 'react-router-dom'

// style
import './Dashboard.css'

// components
import DashboardNav from '../components/DashboardNav'

const Dashboard = ({ children }) => {

    return (
        <section className="">
            <div className="row">
                <div id="main" className="col-sm-12 d-flex">
                    <aside id="sidebar" className="dashboard col-md-2 bg-secondary">
                        <ul className="nav flex-column justify-content-center align-items-center">
                            <li className="nav-item py-md-4 px-md-3">
                                <Link className="nav-link active text-white" to="#">Logo</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link active text-white" to="#">Dashboard</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">All Properties</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">New Properties</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">Messages</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">About</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">Contact</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">Blog</Link>
                            </li>
                            <li className="nav-item p-md-3">
                                <Link className="nav-link text-white" to="#">Logout</Link>
                            </li>
                        </ul>
                    </aside>

                    <article id="dashboard" className="col-sm-12 col-md-10">
                        <header id="menu" className="dashboard d-flex flex-column">
                            <DashboardNav />
                        </header>

                        <main className="py-md-3">

                            {/* { loading && <Loading /> } */}
                            { children }

                        </main>
                    </article>                        
                </div>
            </div>
        </section>
    )

}

export default Dashboard

当我导航到localhost:3000/admin/dashboard 路线时,一切正常,包括沿/admin/dashboard/* 的所有路线,问题是当我导航到localhost:3000 时,它仍然显示仪表板。

我知道有一种方法可以实现这一点。但作为我的第一次,我很难正确地实现它。

【问题讨论】:

    标签: javascript reactjs react-native react-redux react-router


    【解决方案1】:

    即使在 localhost:3000/ 上也能看到仪表板菜单的原因是因为 Dashboard 组件实际上是在该页面上呈现的。当然,Dashboard 组件里面的内容组件,包括DashboardHomeAboutForm 都不会显示在那个页面上,但是dashboard 菜单没有被react router 包裹。

    请尝试以这种方式更新您的组件。

    主路由器:

    <>
       <Switch>
           <Route exact path="/admin/login" component={ Login } />
           <Route path="/admin" component={ Dashboard } />
           <Route path="/" component={ Layout } />
       </Switch>
    </>
    

    仪表板:

    import React, { Component } from 'react'
    import { Link } from 'react-router-dom'
    
    // style
    import './Dashboard.css'
    
    // components
    import DashboardNav from '../components/DashboardNav'
    
    const Dashboard = ({ children }) => {
    
        return (
            <section className="">
                <div className="row">
                    <div id="main" className="col-sm-12 d-flex">
                        <aside id="sidebar" className="dashboard col-md-2 bg-secondary">
                            <ul className="nav flex-column justify-content-center align-items-center">
                                <li className="nav-item py-md-4 px-md-3">
                                    <Link className="nav-link active text-white" to="#">Logo</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link active text-white" to="#">Dashboard</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">All Properties</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">New Properties</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">Messages</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">About</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">Contact</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">Blog</Link>
                                </li>
                                <li className="nav-item p-md-3">
                                    <Link className="nav-link text-white" to="#">Logout</Link>
                                </li>
                            </ul>
                        </aside>
    
                        <article id="dashboard" className="col-sm-12 col-md-10">
                            <header id="menu" className="dashboard d-flex flex-column">
                                <DashboardNav />
                            </header>
    
                            <main className="py-md-3">
    
                                {/* { loading && <Loading /> } */}
                                <Switch>
                                    <Route exact path="/admin/dashboard/" component={ DashboardHome } />
                                    <Route exact path="/admin/dashboard/about" component={ AboutForm } />
                                    <Route exact path="/admin/dashboard/properties" component={ Allproperties } />
                                    <Route exact path="/admin/dashboard/contact" component={ ContactFrom } />
                                    <Route exact path="/admin/dashboard/newproperty" component={ Newproperty } />
                                    {/* <Route exact path="/admin/dashboard/messages" component={ Messages } /> */}
                                </Switch>
    
                            </main>
                        </article>                        
                    </div>
                </div>
            </section>
        )
    
    }
    
    export default Dashboard
    

    布局:

    import React from 'react';
    
    // components
    import Navbar from './Navbar'
    
    const Layout = ({children}) => {
        return (
            <>
                <Navbar />
                <Switch>
                   <Route exact path="/" component={ Home } /> 
                   <Route exact path="/properties/" component={ Properties } />
                   <Route exact path="/services/" component={ Services } />
                   <Route exact path="/contact/" component={ ContactMe } />
                   <Route exact path="/property/:slug" component={ SingleProperty } />
                   <Route component={ Errors } />
                </Switch>
            </>
        );
    
    }
    
    export default Layout;
    

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2019-07-12
      • 2018-03-31
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多