如何在反应路由器的登录页面中隐藏导航栏

时间:2017-11-14 09:19:58

标签: javascript reactjs react-router

我想在登录页面中隐藏导航栏。

我实际上是这样做的,但是我无法在其他页面看到导航栏。

此代码是My App.jsx文件的一部分。

我在App的状态下创造历史。我隐藏了导航栏,当这个路径名是' /'或者' / login'。

有效!

但是我输入了ID和密码,然后点击登录按钮,获得了成功'结果,导航到' / main'。

我也无法在主要组件中看到导航栏。

我该怎么做呢?请帮帮我。

抱歉我的英文短文。如果您无法理解我的问题,可以发表评论。



constructor(props) {
  super(props);
  this.state = {
    isAlertOpen: false,
    history: createBrowserHistory(),
  };
  this.toggleAlert = this.toggleAlert.bind(this);
}

<BrowserRouter>
  <div className="App">
    {this.state.history.location.pathname === '/' || this.state.history.location.pathname === '/login' ? null
      : <Header toggleAlert={this.toggleAlert} />}
    <div className="container">
      {this.state.history.location.pathname === '/' || this.state.history.location.pathname === '/login' ? null
        : <Navbar />}
      <Route exact path="/" render={() => <Redirect to="/login" />} />
      <Route path="/login" component={Login} />
      <Route path="/main" component={Main} />
      <Route path="/user" component={User} />
      <Route path="/hw-setting" component={Setting} />
      <Route path="/hw-detail/:id" component={HwDetail} />
      <Route path="/gas-detail/:id" component={GasDetail} />
      {this.state.isAlertOpen ? <Alert /> : null}
    </div>
  </div>
</BrowserRouter>
&#13;
&#13;
&#13;

&#13;
&#13;
login(event) {
  event.preventDefault();
  userService.login(this.state.id, this.state.password).subscribe(res => {
    if (res.result === 'success') {
      global.token = res.token;
      this.props.history.push('/main');
    } else {
      alert(`[ERROR CODE : ${res.statusCode}] ${res.msg}`);
    }
});
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:25)

您可以采用不同方式构建Routes,以便Login组件没有Header

<BrowserRouter>
  <Switch>
  <div className="App">
    <Route exact path="/(login)" component={LoginContainer}/>
    <Route component={DefaultContainer}/>

  </div>
  </Switch>
</BrowserRouter>

const LoginContainer = () => (
  <div className="container">
    <Route exact path="/" render={() => <Redirect to="/login" />} />
    <Route path="/login" component={Login} />
  </div>
)


 const DefaultContainer = () => (
    <div>
    <Header toggleAlert={this.toggleAlert} />
    <div className="container">
      <Navbar />
      <Route path="/main" component={Main} />
      <Route path="/user" component={User} />
      <Route path="/hw-setting" component={Setting} />
      <Route path="/hw-detail/:id" component={HwDetail} />
      <Route path="/gas-detail/:id" component={GasDetail} />
      {this.state.isAlertOpen ? <Alert /> : null}
    </div>
    </div>
 )

答案 1 :(得分:10)

最简单的方法是使用 div 标签并放置您想要导航栏的组件并将登录路由组件放置在 div 标签之外:

<div className="App">
  <Router>

    <Switch>
      <Route exact path="/" component={Login} />
      <div>
        <NavBar />
   
        <Route exact path="/addproduct" component={Addproduct}></Route>
        <Route exact path="/products" component={Products}></Route>
     
      </div>

    </Switch>
  </Router>

</div>

答案 2 :(得分:-1)

如果在其他路由不匹配的情况下需要在交换机内添加其他默认路由,例如404页面,未找到页面,则接受的答案有问题。

我最终使用简单的CSS在我的登录页面中隐藏了导航栏。

class LoginPage extends React.Component<>{

   ...

   // Hide navigation bar in login page. Do it inside ComponentDidMount as we need to wait for navbar to render before hiding it.
   componentDidMount(){
      document.getElementById('navigation-bar')!.style.display = "none";
   }

   componentWillUnmount(){
      document.getElementById('navigation-bar')!.style.display = "flex";
   }

   render(){
      return(
          // your login/signup component here
          ...
      )
   }

}

相关问题