反应路由器导航链接不会在路线更改时更新
react router nav links not updating on route change
我有一个带有 header 和侧边栏的组件,它包装了我的应用程序的路由器,我遇到的问题是 <NavLink>
没有更新路由更改,假设原因是这个问题是它们在路由器之上,因此不受更改的影响,我尝试了所有可能的方法但没有解决方案,我怎样才能让 <NavLink>
添加 active
class 到当前路线 ?
这是我的 app.js
<Switch>
<Route path="/login" component={ Login } />
<PrivateRoute path="/" component={ Dashboard } exact />
<PrivateRoute path="/members" component={ Members } exact />
<PrivateRoute path="/payments" component={ Bills } exact />
<PrivateRoute path="/gas-stations" component={ GasStations } exact />
<PrivateRoute path="/transactions" component={ Transaction } exact />
<PrivateRoute path="/cms" component={ CMS } />
<PrivateRoute path="/members/:member_id" component={ Member } />
<PrivateRoute path="/gas-stations/:gs" component={ GS } />
<PrivateRoute path="/transactions/:transaction_id" component={ FoundTransaction } />
<PrivateRoute path="/payments/:payment_id" component={ Payment } />
</Switch>
我的private-routes.js
import React from 'react';
import { Route, Redirect, withRouter } from 'react-router-dom';
import { connect } from 'react-redux';
import Container from 'components/container';
const PrivateRoute = ({ component : Component, authenticated, ...rest }) => {
return (
<Route { ...rest } render={ (props) => (
authenticated === true
? <Container> // this is the component that wraps the header and the sidebar
<Component { ...props } />
</Container>
: <Redirect to="/login" />
) } />
)
}
const state_to_props = (state, prop) => {
return {
authenticated : state.authenticated
}
}
export default connect(state_to_props)(withRouter(PrivateRoute));
container.js
return (
<div>
<Header />
<SideMenu />
<div className="app-content">
{ props.children }
</div>
</div>
)
side-menu.js
<li>
<NavLink to="/" exact> <span>Dashboard</span> </NavLink>
</li>
<li>
<NavLink exact to="/members"> <span>Members</span> </NavLink>
</li>
<li>
<NavLink exact to="/gas-stations"> <span>Gas Stations</span> </NavLink>
</li>
<li>
<NavLink exact to="/payments"> <span>Payments</span> </NavLink>
</li>
<li>
<NavLink exact to="/transactions"> <span>Transactions</span> </NavLink>
</li>
<li>
<NavLink exact to="/cms"> <span>CMS</span> </NavLink>
</li>
我如何更新此组件,以便 <NavLink>
继续将 'active' class 添加到侧栏中的正确项目?
您可以使用 withRouter()
.
导出侧边栏菜单文件
import React, { Component } from "react";
import { Link, withRouter } from 'react-router-dom';
class Sidebar extends Component {
constructor(){
....
}
render(){
return(
<li>
<NavLink to="/" exact> <span>Dashboard</span> </NavLink>
</li>
<li>
<NavLink exact to="/members"> <span>Members</span> </NavLink>
</li>
<li>
<NavLink exact to="/gas-stations"> <span>Gas Stations</span> </NavLink>
</li>
<li>
<NavLink exact to="/payments"> <span>Payments</span> </NavLink>
</li>
<li>
<NavLink exact to="/transactions"> <span>Transactions</span> </NavLink>
</li>
<li>
<NavLink exact to="/cms"> <span>CMS</span> </NavLink>
</li>
)
}
}
export default withRouter(Sidebar);
您需要用 withRouter
包裹 connect
而不是相反(请参阅 重要说明 https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/withRouter.md).
所以
export default connect(state_to_props)(withRouter(PrivateRoute));
尝试
export default withRouter(connect(state_to_props)(PrivateRoute));
我有一个带有 header 和侧边栏的组件,它包装了我的应用程序的路由器,我遇到的问题是 <NavLink>
没有更新路由更改,假设原因是这个问题是它们在路由器之上,因此不受更改的影响,我尝试了所有可能的方法但没有解决方案,我怎样才能让 <NavLink>
添加 active
class 到当前路线 ?
这是我的 app.js
<Switch>
<Route path="/login" component={ Login } />
<PrivateRoute path="/" component={ Dashboard } exact />
<PrivateRoute path="/members" component={ Members } exact />
<PrivateRoute path="/payments" component={ Bills } exact />
<PrivateRoute path="/gas-stations" component={ GasStations } exact />
<PrivateRoute path="/transactions" component={ Transaction } exact />
<PrivateRoute path="/cms" component={ CMS } />
<PrivateRoute path="/members/:member_id" component={ Member } />
<PrivateRoute path="/gas-stations/:gs" component={ GS } />
<PrivateRoute path="/transactions/:transaction_id" component={ FoundTransaction } />
<PrivateRoute path="/payments/:payment_id" component={ Payment } />
</Switch>
我的private-routes.js
import React from 'react';
import { Route, Redirect, withRouter } from 'react-router-dom';
import { connect } from 'react-redux';
import Container from 'components/container';
const PrivateRoute = ({ component : Component, authenticated, ...rest }) => {
return (
<Route { ...rest } render={ (props) => (
authenticated === true
? <Container> // this is the component that wraps the header and the sidebar
<Component { ...props } />
</Container>
: <Redirect to="/login" />
) } />
)
}
const state_to_props = (state, prop) => {
return {
authenticated : state.authenticated
}
}
export default connect(state_to_props)(withRouter(PrivateRoute));
container.js
return (
<div>
<Header />
<SideMenu />
<div className="app-content">
{ props.children }
</div>
</div>
)
side-menu.js
<li>
<NavLink to="/" exact> <span>Dashboard</span> </NavLink>
</li>
<li>
<NavLink exact to="/members"> <span>Members</span> </NavLink>
</li>
<li>
<NavLink exact to="/gas-stations"> <span>Gas Stations</span> </NavLink>
</li>
<li>
<NavLink exact to="/payments"> <span>Payments</span> </NavLink>
</li>
<li>
<NavLink exact to="/transactions"> <span>Transactions</span> </NavLink>
</li>
<li>
<NavLink exact to="/cms"> <span>CMS</span> </NavLink>
</li>
我如何更新此组件,以便 <NavLink>
继续将 'active' class 添加到侧栏中的正确项目?
您可以使用 withRouter()
.
import React, { Component } from "react";
import { Link, withRouter } from 'react-router-dom';
class Sidebar extends Component {
constructor(){
....
}
render(){
return(
<li>
<NavLink to="/" exact> <span>Dashboard</span> </NavLink>
</li>
<li>
<NavLink exact to="/members"> <span>Members</span> </NavLink>
</li>
<li>
<NavLink exact to="/gas-stations"> <span>Gas Stations</span> </NavLink>
</li>
<li>
<NavLink exact to="/payments"> <span>Payments</span> </NavLink>
</li>
<li>
<NavLink exact to="/transactions"> <span>Transactions</span> </NavLink>
</li>
<li>
<NavLink exact to="/cms"> <span>CMS</span> </NavLink>
</li>
)
}
}
export default withRouter(Sidebar);
您需要用 withRouter
包裹 connect
而不是相反(请参阅 重要说明 https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/withRouter.md).
所以
export default connect(state_to_props)(withRouter(PrivateRoute));
尝试
export default withRouter(connect(state_to_props)(PrivateRoute));