![](/img/trans.png)
[英]Why is BrowserRouter and Route from 'react-router-dom' not working properly?
[英]How properly setup react-router-dom in Home Route?
我有这个index.js :
<Provider store={store}>
<Router history={history}>
<App/>
</Router>
</Provider>
这个App.js :
<Switch>
<Route exact path="/" component={Home} />
<Route
path="/login"
render={() => <Login userError={this.state.userError} />}
/>
<Route path="/registration" component={Registration} />;
</Switch>
和Home.js :
<div className="Home">
<Header/>
<div className="content">
<Sidenav/>
<Switch>
<Route path="/friends" component={Friends}/>
</Switch>
<Feed/>
</div>
</div>
我希望Friends组件在content
块内呈现,但是现在如果我尝试通过Link
到达/friends
路线,我会得到空白页面。 如果我在App.js 中设置/friends
Route ,那就没问题了,但我的content
类中不会有它,因为它将是另一个页面。
你能帮我处理一下吗?
同样在功能中,我将在content
显示更多项目,这就是我将Switch
放在Home.js
中的Home.js
提前致谢!
content
类和<Friends>
您遇到的问题是,部分Home
当您访问不渲染/friends
,因为当你去只会渲染/
要解决这个问题,只需将Route
移动到App.js文件中,并将content
类移动到Friends
组件中。
为了使这更容易,您可以将您的content
类变成一个组件。 这样你就可以把它包裹在你渲染的所有东西上。
<Friends>
并包装content
我的意思是,您还可以创建自己的Route
组件,将传递给它的任何组件包装在Content
组件中。 它可能类似于:
const ContentRoute = ({ component, ...props }) => (
<Route {...props} component={() => (
<Content>
<component />
</Content>
)}>
</Route>
)
您可以在此处访问演示
这是我所做的。 这演示了如何在页面更改时设置布局。
- src/
-- components/
--- Header.js
--- Sidenav.js
-- pages/
--- Home.js
--- Login.js
--- withBase.js
-- App.js
-- BaseLayout.js
-- routes.js
首先,让我们制作虚拟组件。
组件/标题
import React from 'react';
export default () => (
<div>
This is Header.
</div>
);
组件/Sidenav
import React from 'react';
export default () => (
<div>
This is Sidenav.
</div>
);
然后,页面。
页数/首页
import React from 'react';
import { NavLink } from 'react-router-dom';
import withBase from './withBase';
const Home = () => (
<div>
<p>Welcome Home!!!</p>
<NavLink to="/login">Go to login page</NavLink>
</div>
);
export default withBase(Home);
页面/登录
import React from 'react';
import { NavLink } from 'react-router-dom';
import withBase from './withBase';
const Login = () => (
<div>
<p>You have to login here...</p>
<NavLink to="/">Go home</NavLink>
</div>
);
export default withBase(Login);
页数/withBase
import React from 'react';
export default WrappedComponent => (
class extends React.Component {
componentDidMount() {
this.props.showHeaderSidenav();
}
render() {
return <WrappedComponent />;
}
}
);
如您所见, withBase
是一个HOC 。 它在页面安装时运行showHeaderSidenav
。
应用程序
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import BaseLayout from './BaseLayout';
import routes from './routes';
export default class extends React.Component {
state = {
withHeaderSidenav: true
}
showHeaderSidenav = (withHeaderSidenav = true) => {
this.setState({ withHeaderSidenav });
}
render() {
return (
<BaseLayout withHeaderSidenav={this.state.withHeaderSidenav}>
<Switch>
{routes.map(route => (
<Route
exact
key={route.path}
path={route.path}
render={() => (
<route.component
showHeaderSidenav={() => this.showHeaderSidenav(route.withHeaderSidenav)}
/>
)}
/>
))}
</Switch>
</BaseLayout>
);
}
}
基本布局
import React from 'react';
import Header from './components/Header';
import Sidenav from './components/Sidenav';
export default ({ withHeaderSidenav, children }) => (
<div>
{withHeaderSidenav && <Header />}
<div className="content">
{withHeaderSidenav && <Sidenav />}
{children}
</div>
</div>
);
我们可以说BaseLayout
就像一个包装器。 它包含将基于withHeaderSidenav
道具显示的动态组件。
最后...
路线
import Home from './pages/Home';
import Login from './pages/Login';
export default [
{
path: '/',
component: Home,
withHeaderSidenav: true
},
{
path: '/login',
component: Login,
withHeaderSidenav: false
},
];
您可以在 Friends 组件中移动(声明)内容组件。 我不明白为什么内容组件应该存在于 Friends 组件之外。 您可以在任何需要它的组件中声明内容组件。内容组件不必与路由实现混淆
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.