【问题标题】:How to hide Nav bar in some react components如何在某些反应组件中隐藏导航栏
【发布时间】:2019-04-05 11:03:39
【问题描述】:

我正在尝试使用 react 来创建登录流程。路线按预期工作。但是当我尝试引入导航栏时,它在所有路线上都可见。我只想在选定的组件上显示导航栏(仅在配置文件和主路线上)。

任何建议将不胜感激。

这是 Routes.js:

export default class Routes extends Component {
  render() {
    return (
      <Switch>
        <Route
          exact
          path='/*/home'
          component={Home}
        />
        <Route
          exact
          path='/*/login'
          component={Login}
        />
        <Route
          exact
          path='/*/profile'
          component={Profile}
        />
        <Route
          exact
          path='/'
          component={Main}
        />
        <Route
          exact
          path='/*/'
          component={Org}
        />
      </Switch>
    );
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

这是 App.js:

<div className="App">
  <Nav />
  <Routes />
</div>

【问题讨论】:

标签: reactjs react-router-v4


【解决方案1】:

您的Nav 组件正在每个视图中呈现,因为它位于您的视图之外。这里有几个选项:

  1. 仅将 Nav 移动到主页和个人资料中。如果您想保持 Routes 组件不变,这将是有意义的。
  2. 构建一个higher-order component 用于渲染视图withNav。如果您需要渲染的不仅仅是带有导航的家庭和个人资料,这将是最佳选择。假设您有一个模态框,它需要具有完全相同的Nav(出于某种原因),构建一个 HOC 可能是有意义的
  3. 更改组件树以反映您需要的结构。如果只有 home 和 profile 需要 Nav,那么在单独的组件中声明这两个路由可能是有意义的。

【讨论】:

  • 我认为您的第三个选项对我有用。为了澄清,你的意思是说我应该创建一个新的路由组件,它将显示导航栏并相应地呈现它?
  • 我认为这取决于您的Org、Main 和Login 视图,因为它们听起来类似于Home 和Profile。问问自己,我可以创建什么抽象级别来对这些视图进行分组?在不审查您的应用程序的情况下,我能想到的最简单的一个是 NavableRoutes 组件,用于任何带有 Nav 的组件和 NavlessRoutes 用于其他组件。
【解决方案2】:

您可以尝试在 css 中隐藏导航栏,并使用 React-Helmet 在特定组件中显示

 <Helmet>
      <style type="text/css">{`
    .navbar {
        display: inline
    }

`}</style>
    </Helmet>

【讨论】:

    【解决方案3】:

    以下代码对我有用

     <style type="text/css">
          {`.navbar {display: none}`}
        </style>
    

    【讨论】:

      【解决方案4】:

      这里是解决方案。检查“react-router-dom”中的useLocation钩子

      function App() {
        const location = useLocation();
      
        return (
          <>
            {location.pathname === '/' ? null : <Navbar />}
      
            <Switch>
              <Route path='/' exact component={Home} />
              <Route path='/projects' component={Projects} />
              <Route path='/about' component={About} />
            </Switch>
          </>
        );
      }
      
      export default App;

      【讨论】:

        猜你喜欢
        • 2017-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 2016-03-31
        相关资源
        最近更新 更多