我只想显示以下网址的导航栏:/contact
,/services
。而且我不想为/signin
显示Navbar。目前,这就是我拥有的:
import React, { Component } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import PublicLayout from './components/layouts/PublicLayout';
import SigninLayout from './components/layouts/SigninLayout';
import Main from './components/pages/Main';
import Services from './components/pages/Services';
import Contact from './components/pages/Contact';
class App extends Component {
render() {
return (
<BrowserRouter>
<div className="App">
<Switch>
<PublicLayout>
<Route exact path='/' component={Main} />
<Route exact path='/services' component={Services} />
<Route exact path='/contact' component={Contact} />
</PublicLayout>
<SigninLayout>
<Route exact path='/signin' component={Signin} />
</SigninLayout>
</Switch>
</div>
</BrowserRouter>
);
}
}
export default App;
当我转到/signin
网址时,它仍然给我导航栏。伙计们-您如何在React中为不同的页面呈现不同的布局?请帮忙!
UPD:我的PublicLayout代码:
import React, { Component } from 'react';
import Navbar from '../nav/Navbar';
class PublicLayout extends Component {
state = {
items: [
{ id: 1, name: 'Услуги', link: '/services' },
{ id: 2, name: 'Как это работает?', link: '/contacts' },
{ id: 3, name: 'Войти', link: '/signin' },
]
}
render() {
return (
<div>
<Navbar items={ this.state.items } />
{ this.props.children }
</div>
);
}
}
export default PublicLayout;
我的SignInLayout代码:
import React, { Component } from 'react';
class SigninLayout extends Component {
state = {
}
render() {
return (
<div>
{ this.props.children }
</div>
);
}
}
export default SigninLayout;
我的登录组件:
import React, { Component } from 'react';
class Signin extends Component {
state = {
}
render() {
return (
<div>
<h1>Войти</h1>
<form>
<input type="text" placeholder="укажите e-mail" />
<input type="text" placeholder="укажите пароль" />
<button>Войти</button>
</form>
</div>
);
}
}
export default Signin;
答案 0 :(得分:5)
您可以通过以下方式实现此目的:首先使用switch语句选择要渲染的布局,然后将应在该布局内渲染的组件的路由移动到布局组件内 。
作为一个非常基本的示例,您的App
组件可能具有:
<BrowserRouter>
<div className="App">
<Switch>
<Route path="/signin" component={PrivateLayout} />
<Route path="/" component={PublicLayout} />
</Switch>
</div>
</BrowserRouter>
现在在PublicLayout中,您可以渲染Nav并创建一些新路线,例如
class PublicLayout extends Component {
render() {
return (
<div>
<h1>Public Place</h1>
<Navbar items={[]} />
<Switch>
<Route exact path='/' component={Main} />
<Route exact path='/services' component={Services} />
<Route exact path='/contact' component={Contact} />
</Switch>
</div>
);
}
}
export default PublicLayout;
...并且在PrivateLayout中,您可以在没有NavBar的情况下渲染一组路线。
class PrivateLayout extends Component {
render() {
return (
<div>
<h1>Private Place</h1>
<Switch>
<Route exact path="/signin" component={Signin} />
<Route exact path="/signin/otherpath" component={OtherPrivateComponent} />
</Switch>
</div>
);
}
}
export default PrivateLayout;
这里全都放在一个文件中,您也可以see on this codesandbox:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { BrowserRouter, Route, Switch } from "react-router-dom";
const NavBar = props => <div>Nav Bar</div>;
class PrivateLayout extends Component {
render() {
return (
<div>
<h1>Private</h1>
<Switch>
<Route exact path="/signin" render={() => <h2>Signin</h2>} />
<Route
exact
path="/signin/otherpath"
render={() => <h2>Signin Other</h2>}
/>
</Switch>
</div>
);
}
}
class PublicLayout extends Component {
render() {
return (
<div>
<h1>Public Place</h1>
<NavBar />
<Switch>
<Route exact path="/" render={() => <h2>Main Page</h2>} />
</Switch>
</div>
);
}
}
function App() {
return (
<div className="App">
<BrowserRouter>
<Switch>
<Route path="/signin" component={PrivateLayout} />
<Route path="/" component={PublicLayout} />
</Switch>
</BrowserRouter>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);