【问题标题】:react router nav links not updating on route change反应路由器导航链接不更新路由更改
【发布时间】:2018-10-23 10:13:10
【问题描述】:

我有一个带有标题和侧边栏的组件,它包装了我的应用程序的路由器,我遇到的问题是 <NavLink> 没有更新路由更改,假设这个问题的原因是它们高于路由器,因此不受更改的影响,我尝试了所有可能的方法但没有解决方案,我怎样才能使<NavLink>active 类添加到当前路由?

这是我的 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>

我的私人路由.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>

如何更新此组件,以便&lt;NavLink&gt; 继续将“活动”类添加到侧边栏中的正确项目?

【问题讨论】:

    标签: javascript reactjs react-router react-router-v4 react-router-dom


    【解决方案1】:

    您需要用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));
    

    【讨论】:

      【解决方案2】:

      您可以使用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 导出.. 像这样export default connect(state_to_props)(withRouter(SideMenu));
      • 使用 withRouter() 导出侧边栏。 &lt;Link to="/"&gt; &lt;span&gt;Dashboard&lt;/span&gt; &lt;/Link &gt; 并尝试使用链接选项卡。
      猜你喜欢
      • 1970-01-01
      • 2020-03-24
      • 2016-12-13
      • 2019-12-14
      • 1970-01-01
      • 2018-01-05
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多