从React Router V4中的同级组件执行路由更改

时间:2018-11-15 07:11:30

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

我正在学习React.js。我正在使用React Router版本4.3.1和React Router dom 4.3.1。

下面是我当前的应用结构。

<React.Fragment>
  {/* sidebar component */}
  <SideBar store = {Mystore} />
  <div className="main-panel">
  {/* navbar component */}
  <NavBar store = {Mystore}/>
  {/* content component */}
  <Content store = {Mystore}/>
  {/* footer component */}
  </div>
</React.Fragment>

在我的内容组件中,我设置了一个路由器,如下所示。

<BrowserRouter> 
  <React.Fragment> 
  <Route exact path="/phoenix/public" component={Login} /> 
  <ProtectedRoute exact path="/phoenix/public/sample" component={SamplePage} /> 
  <ProtectedRoute exact path="/phoenix/public/view_ticket" component={ViewTicket} /> 
  <ProtectedRoute exact path="/phoenix/public/create_ticket" component={CreateTicket} /> 
  <ProtectedRoute exact path="/phoenix/public/dashboard" component={Dashborad} /> 
  </React.Fragment> 
</BrowserRouter>

此处 ProtectedRoute 是一个功能组件,可检查用户是否已通过身份验证并返回 Route

我的侧边栏有一些 a 标记,如下所示。

<li> 
  <a href="dashboard"> 
  <i className="ti-panel" /> 
  <p>Dashboard</p> 
  </a> 
</li>

我的目标是导航至不同的路线,而无需单击侧边栏上的页面即可刷新页面。但是,单击href会重新加载页面,并且Mobx中的所有状态都会刷新。我已尝试重定向,但无法获得兄弟姐妹组件中声明的路由器(内容是侧边栏的兄弟姐妹)。我不知道如何实现这一目标。

2 个答案:

答案 0 :(得分:0)

如您对问题的评论中所述,常规<a>标签将不起作用,并刷新页面。因此,您将需要使用Link或NavLink。

如果要使其在侧边栏(子组件)中工作,则需要将<BrowserRouter>包装在要使用路线的所有组件周围。

例如这样的示例(使用您的代码):

<BrowserRouter>
<React.Fragment>
  {/* sidebar component */}
  <SideBar store = {Mystore} />
  <div className="main-panel">
  {/* navbar component */}
  <NavBar store = {Mystore}/>
  {/* content component */}
  <Content store = {Mystore}/>
  {/* footer component */}
  </div>
</React.Fragment>
</BrowserRouter>

您的补充工具栏将如下所示:

<React.Fragment>
    <Link to="/dashboard">Dashboard</Link> 
    ...
</React.Fragment>

然后在您的内容组件中。您需要删除<BrowserRouter>

答案 1 :(得分:0)

我按照@PreDinnerSnack的建议,通过如下所示的BrowserRouter解决了我的问题。

<BrowserRouter>
<React.Fragment>
  {/* sidebar component */}
  <SideBar store = {Mystore} />
  <div className="main-panel">
  {/* navbar component */}
  <NavBar store = {Mystore}/>
  {/* content component */}
  <Content store = {Mystore}/>
  {/* footer component */}
  </div>
</React.Fragment>
</BrowserRouter>

然后,我在“我的侧边栏”组件中使用了Navlink。这解决了导航到所需路由而不刷新页面的问题。但是后来我遇到了另一个问题,因为内容没有按照路线刷新。

对于这个问题,我发现Mobx的观察者HOC正在干扰我的路由器。我必须使用withRouter包装我的内容,如下所示。

withRouter(observer(Content));

我希望我的解决方案能对某些人派上用场,因为我没有找到关于React Router实现示例的教程,例如在网上。