React Router v4 - 如何获取当前路由?

时间:2017-02-15 15:17:32

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

我想在title中显示<AppBar />,它以某种方式从当前路线传入。

在React Router v4中,<AppBar />如何能够将当前路由传递到它的title道具?

  <Router basename='/app'>
    <main>
      <Menu active={menu} close={this.closeMenu} />
      <Overlay active={menu} onClick={this.closeMenu} />
      <AppBar handleMenuIcon={this.handleMenuIcon} title='Test' />
      <Route path='/customers' component={Customers} />
    </main>
  </Router>

有没有办法从prop上的自定义<Route />传递自定义标题?

8 个答案:

答案 0 :(得分:153)

在5.1版本的react-router中,有一个名为 useLocation 的钩子,该钩子返回当前的位置对象。每当您需要知道当前URL时,这可能都会有用。

import { useLocation } from 'react-router-dom'

function HeaderView() {
  const location = useLocation();
  console.log(location.pathname);
  return <span>Path : {location.pathname}</span>
}

答案 1 :(得分:127)

在反应路由器4中,当前路由是 -     this.props.location.pathname。 只需获取this.props并验证即可。 如果您仍然没有看到location.pathname,那么您应该使用装饰器withRouter

这看起来像这样:

import {withRouter} from 'react-router-dom';

const SomeComponent = withRouter(props => <MyComponent {...props}/>);

class MyComponent extends React.Component {
  SomeMethod () {
    const {pathname} = this.props.location;
  }
}

答案 2 :(得分:38)

如果您使用React的模板,则React文件的末尾如下所示:export default SomeComponent,您需要使用高阶组件(通常称为“ HOC”),{{1} }。

首先,您需要像这样导入withRouter

withRouter

接下来,您将要使用 import {withRouter} from 'react-router-dom'; 。您可以通过更改组件的导出来做到这一点。您可能想从withRouter更改为export default ComponentName

然后您可以从道具获得路线(和其他信息)。具体来说,export default withRouter(ComponentName)locationmatch。吐出路径名的代码为:

history

此处提供了包含其他信息的优质文章:https://reacttraining.com/react-router/core/guides/philosophy

答案 3 :(得分:34)

react-router v5中有一个名为useLocation的钩子,不需要HOC或其他内容,非常简洁方便。

import { useLocation } from 'react-router-dom';

const ExampleComponent: React.FC = () => {
  const location = useLocation();  

  return (
    <Router basename='/app'>
      <main>
        <AppBar handleMenuIcon={this.handleMenuIcon} title={location.pathname} />
      </main>
    </Router>
  );
}

答案 4 :(得分:8)

我认为React Router(v4)的作者刚刚添加了withRouter HOC来安抚某些用户。但是,我认为更好的方法是使用渲染道具并制作一个简单的PropsRoute组件来传递这些道具。这更容易测试,因为它没有连接&#34;与路由器一样的组件。将一堆嵌套组件包含在withRouter中并且它不会很有趣。另一个好处是你也可以使用这个传递你希望路线的任何道具。这是使用render prop的简单示例。 (几乎是他们网站https://reacttraining.com/react-router/web/api/Route/render-func的确切示例) (SRC /组件/路由/道具路线)

import React from 'react';
import { Route } from 'react-router';

export const PropsRoute = ({ component: Component, ...props }) => (
  <Route
    { ...props }
    render={ renderProps => (<Component { ...renderProps } { ...props } />) }
  />
);

export default PropsRoute;

用法:(通知获取路线参数(match.params)你可以使用这个组件,那些将被传递给你)

import React from 'react';
import PropsRoute from 'src/components/routes/props-route';

export const someComponent = props => (<PropsRoute component={ Profile } />);

也注意到你也可以通过这种方式传递任何额外的道具

<PropsRoute isFetching={ isFetchingProfile } title="User Profile" component={ Profile } />

答案 5 :(得分:5)

这是使用.Trash Read more

的解决方案
history

内部路由器

import { createBrowserHistory } from "history";

const history = createBrowserHistory()

答案 6 :(得分:2)

已经Con Posidielov说过,当前路由存在于this.props.location.pathname中。

但是,如果要匹配键(或名称)等更具体的字段,则可以使用matchPath查找原始路线参考。

import { matchPath } from `react-router`

const routes = [{
  key: 'page1'
  exact: true,
  path: '/page1/:someparam/',
  component: Page1,
},
{
  exact: true,
  key: 'page2',
  path: '/page2',
  component: Page2,
},
]

const currentRoute = routes.find(
  route => matchPath(this.props.location.pathname, route)
)

console.log(`My current route key is : ${currentRoute.key}`)

答案 7 :(得分:1)

添加

import {withRouter} from 'react-router-dom';

然后更改您的组件导出

export default withRouter(ComponentName)

然后,您可以使用以下方法直接在组件本身内访问路线(无需触摸项目中的任何其他内容):

window.location.pathname

经2020年3月测试:“版本”:“ 5.1.2”