使用 react-router-dom,如何从 React 组件外部访问浏览器历史对象?
Posted
技术标签:
【中文标题】使用 react-router-dom,如何从 React 组件外部访问浏览器历史对象?【英文标题】:Usign react-router-dom, how can I access browserHistory object from outside a React component? 【发布时间】:2017-08-31 20:29:08 【问题描述】:使用之前的 react-router 我能够做到这一点:
import browserHistory from 'react-router';
从我的 actionCreators 文件中,我可以执行以下操作:
...some async action completed (for example, user logged in successfully)..
browserHistory.push('/dashboard');
但是使用新的 react-router-dom (v4) 似乎我不能再像那样导入 browserHistory 并且访问历史对象的唯一方法是从 React 组件道具
this.props.history
在使用 react-router-dom 完成异步 redux 操作后,有什么方法可以将我的用户重定向到新页面?
【问题讨论】:
【参考方案1】:withRouter 就是你要找的东西。
“您可以通过withRouter 高阶组件访问历史对象的属性和最接近的匹配项。”
import React, PropTypes from 'react'
import withRouter from 'react-router'
// A simple component that shows the pathname of the current location
class ShowTheLocation extends React.Component
static propTypes =
match: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
render()
const match, location, history = this.props
return (
<div>You are now at location.pathname</div>
)
// Create a new component that is "connected" (to borrow redux
// terminology) to the router.
const ShowTheLocationWithRouter = withRouter(ShowTheLocation)
【讨论】:
但是如果我想在 redux-thunk 或 redux-saga 中使用历史对象呢?不在反应组件内 所以最后我所做的是在异步操作完成时将 redux state 属性更改为 true(可以说它称为“userLogged”)。我将容器组件包装在“withRouter”中,并在“componentWillReceiveProps”方法中检查“userLogged”属性是否为真,然后使用历史对象推送新路由。 实际上我在 react router 网站示例中找到了一种方法来做我想做的事情。看起来你可以在 render() 方法上返回一个以上是关于使用 react-router-dom,如何从 React 组件外部访问浏览器历史对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何正确使用 react-router-dom 中的 useHistory()?
如何使用 Typescript 从 react-router-dom 访问路由参数?例如:`/some-route/:slug`
如何从 react-router 升级到 react-router-dom?
React JS如何使用react-router-dom将数组作为参数传递
如何在 react-router-dom 中使用 context api": "^5.2.0" 和 react": "^17.0.2"