如何在react-router 2.0.0-rc5中获取当前路由


83

我有一个如下的路由器:

<Router history={hashHistory}>
    <Route path="/" component={App}>
        <IndexRoute component={Index}/>
        <Route path="login" component={Login}/>
    </Route>
</Router>

这是我要实现的目标:

  1. 将用户重定向到(/login如果未登录)
  2. 如果用户/login在已经登录时尝试访问,请将其重定向到root/

所以现在我想以检查用户的状态AppcomponentDidMount,然后做一些事情,如:

if (!user.isLoggedIn) {
    this.context.router.push('login')
} else if(currentRoute == 'login') {
    this.context.router.push('/')
}

这里的问题是我找不到获取当前路由的API。

我发现建议使用Router.ActiveState mixin和路由处理程序来解决此已关闭的问题,但是现在似乎已弃用了这两个解决方案。

Answers:


112

阅读更多文档后,我找到了解决方案:

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md

我只需要访问location组件实例的注入属性,例如:

var currentLocation = this.props.location.pathname

5
在某些子组件中不可用,但是我设法通过prop传递了它们。
Damjan Pavlica '16

1
对我来说(v2.8.1),可以通过this.state.location.pathname(代替道具)获得。
internet-nico

2
您需要确保将其添加到您的组件中 static contextTypes = { router: React.PropTypes.object }
Alex Cory

1
如果子组件不可用,则只需要使用withRouter()进行换行
Michael Brown

谢谢,该链接是有帮助的!
Alex Yursha

27

您可以使用获取当前路线

const currentRoute = this.props.routes[this.props.routes.length - 1];

...使您可以从最低级别的活动<Route ...>组件访问道具。

鉴于...

<Route path="childpath" component={ChildComponent} />

currentRoute.path返回'childpath'currentRoute.component返回function _class() { ... }


1
这是一个很棒的方法,因为它保留了路由上定义的所有自定义属性。this.props.location失去这些自定义属性。
XtraSimplicity '16

要获得先前的路线(即返回按钮和标签),您可以使用this.props.routes.length - 2
devonj

10

如果使用历史记录,则路由器会将所有内容都放入历史记录中,例如:

this.props.location.pathname;
this.props.location.query;

得到它?


13
也许您可以扩展您的答案,以获得更多输入和一些参考?现在太笼统了
Farside

8

从3.0.0版开始,您可以通过调用以下命令获取当前路由:

this.context.router.location.pathname

示例代码如下:

var NavLink = React.createClass({
    contextTypes: {
        router: React.PropTypes.object
    },

    render() {   
        return (
            <Link {...this.props}></Link>
        );
    }
});

7

对于2017年有相同问题的所有用户,我可以通过以下方式解决:

NavBar.contextTypes = {
    router: React.PropTypes.object,
    location: React.PropTypes.object
}

并像这样使用它:

componentDidMount () {
    console.log(this.context.location.pathname);
}

1
由于PropTypes现在是一个独立的依赖项,因此可以添加以下内容: import PropTypes from 'prop-types'; ... NavBar.contextTypes = { router: PropTypes.object, location: PropTypes.object };
逻辑

4

App.js添加以下代码并尝试

window.location.pathname

2

您可以像这样使用“ isActive”道具:

const { router } = this.context;
if (router.isActive('/login')) {
    router.push('/');
}

isActive将返回true或false。

经过react-router 2.7测试


0

以同样的方式为我工作:

...
<MyComponent {...this.props}>
  <Route path="path1" name="pname1" component="FirstPath">
  ...
</MyComponent>
...

然后,我可以在MyComponent函数中访问“ this.props.location.pathname”。

我忘了那是我...)))以下链接描述了更多关于制作导航栏的内容:反应路由器this.props.location


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.