我想在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 />
传递自定义标题?
答案 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)
,location
和match
。吐出路径名的代码为:
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”