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

IT技术 reactjs react-router react-router-v4
2021-04-05 00:19:05

我想显示title<AppBar />以某种方式从目前的路线通过。

在 React Router v4 中,如何将<AppBar />当前路由传递到它的titleprop 中?

  <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 />

6个回答

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

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

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

非常适合单元测试兼容性,避免模拟 window.location
2021-05-22 00:19:05
如果使用路由器redirect这也将不起作用这将在重定向之前读取路径
2021-05-25 00:19:05
请注意,这只能在 Router DOM 内部使用(即 chid 组件,不能在使用 Router 的类/功能组件中)。这可能很明显,但对于像我这样的新手来说不是:-) 我一直收到错误“useContext 未定义”
2021-06-10 00:19:05
为什么不将 location 设为 aconst而不是 a ,let因为我们知道在这种情况下它不会改变?
2021-06-12 00:19:05

在react-router 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;
  }
}
此解决方案不提供如何在包含 <Router> 本身的组件中使用这些道具。
2021-06-10 00:19:05
我们如何在 React 组件之外以编程方式获取它?
2021-06-16 00:19:05
请注意,这并不总是正确的:对于 react-router4 ,如果您的组件在某些嵌套路由(稍后扩展路径)的更高级别上呈现,则 WithRouter 中的 location.pathname 将与 window.location.pathname
2021-06-19 00:19:05

如果您正在使用 react 的模板,那么您的 react 文件的结尾如下所示:export default SomeComponent您需要使用高阶组件(通常称为“HOC”),withRouter.

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

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

接下来,您将要使用 withRouter. 您可以通过更改组件的导出来做到这一点。您很可能想从 更改export default ComponentNameexport default withRouter(ComponentName)

然后你可以从props中获取路线(和其他信息)。具体来说locationmatch、 和history吐出路径名的代码是:

console.log(this.props.location.pathname);

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

但是你如何获得完整的网址?
2021-05-22 00:19:05

react-router v5有一个叫做useLocation的hook ,不需要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>
  );
}
这个答案的评分应该更高。使用钩子比这些其他解决方案更容易和直观(如果在 RR v5 上)
2021-05-31 00:19:05
这是 RR v5 的当前答案
2021-05-31 00:19:05

这是使用阅读更多的解决方案history

import { createBrowserHistory } from "history";

const history = createBrowserHistory()

路由器内部

<Router>
   {history.location.pathname}
</Router>
这是唯一直接在 <Router></Router> 标签内工作的解决方案,没有子组件或直接使用文档/窗口位置。
2021-05-22 00:19:05
对于我们这些在反应功能路径上的人来说,这个答案最有意义。那些this.props....对我们耳朵来说只是噪音的东西。
2021-05-30 00:19:05