【问题标题】:react-router: how to get the previous route in onEnter handler?react-router:如何在 onEnter 处理程序中获取上一个路由?
【发布时间】:2016-08-07 20:37:10
【问题描述】:

我正在尝试在onEnter 处理程序中找到一种方法来在用户点击新路径/路径时读取先前的路径/路径。

我有一个结构如下的 React 路由器:

    <Router history={history}>
      <div className="index">
        <Route
          path="/"
          component={ComposedAppComponent}
          onEnter={this.onEnterHandler.bind(this)}
        >
          <Route name="streamKey" path=":streamKey">
            <Route name="articleUri" path="(**)" />
          </Route>
        </Route>
      </div>
    </Router>

函数onEnterHandler 如下所示:

  onEnterHandler(nextRouteState) {
    const { streamKey, splat } = nextRouteState.params;

    const nextPath = `/${streamKey}/${splat}`;
    const prevPath = // HOW DO I GET THE PREVIOUS PATH?
  }

我似乎无法找到读取用户之前的路线路径的方法...我需要在新路线和之前的路线之间进行比较。非常感谢任何有关如何解决此问题的意见。 :)

干杯!

【问题讨论】:

  • 很确定第二个参数是最后一个状态。
  • 哦,我的错,但onChange 正下方的函数似乎正是您正在寻找的功能
  • @azium 感谢您的提示,但我认为这行不通。当用户输入路线时,我需要触发它。
  • 哦... this 怎么样?我刚试过,我得到了以前的(当前)路径!

标签: reactjs react-router react-router-redux


【解决方案1】:

当用户通过地址栏导航到新路径或使用 this.context.router.push() 之类的 react-router 时,您是否尝试获取以前的路径?

如果导航使用react-router,也许这些简单的方法会得到你想要的:

1.使用query-params传递prevPath

导航可能如下所示:

`<Link to="/next" query={{ prevPath: this.props.location.pathname }}> Your Next path</Link>`

现在,您可以使用以下方法在 onEnterHandler 方法上获取您的 prevPath 值: nextState.location.query.prevPath

  • 缺点:查询将显示在地址栏上。
  • 优点:当用户通过地址栏导航(直接路径访问)时,您仍然可以获得prevPath

2。使用状态传递prevPath

导航可能如下所示:

`<Link to="/next" state={{ prevPath: this.props.location.pathname }}> Your Next path</Link>`

现在,您可以使用以下方法在 onEnterHandler 方法上获取您的 prevPath 值: nextState.location.state.prevPath

  • 缺点:查询不会出现在地址栏上。
  • 优点:当用户通过地址栏导航(直接路径访问)时,您无法获得prevPath

此外,这些方法的缺点是您应该为每个 Link 组件分配一个 prevPath 值。为 Link 组件创建一个包装器组件可以解决这个问题。

【讨论】:

  • Link 组件的包装器看起来如何?我是 React 的初学者,所以如果这是一个新手问题,我深表歉意。 @mirza.adipradhana
  • @JayS。您将创建一个 HOC(高阶组件) - 我们称之为 &lt;MyLink /&gt;。在里面你会有一个普通的&lt;Link /&gt;,但是你会传递给它query/state prop。那么任何时候你使用&lt;MyLink /&gt;而不是&lt;Link /&gt;你都不需要指定query/state,因为你创建的包装器会自动为你传递它。
猜你喜欢
  • 2016-09-09
  • 1970-01-01
  • 2016-11-06
  • 2019-02-19
  • 2017-01-15
  • 2016-10-22
  • 2018-12-13
  • 2018-08-01
相关资源
最近更新 更多