React Router 使后退阻止前进
React Router make back prevent forward
要求: 当点击按钮推送#info 路由以显示全屏覆盖组件时,关闭模式或按返回应该关闭覆盖而不是转到上一页。
例如在第 1 页,转到第 2 页。在第 2 页,按 按钮显示覆盖。按后退键或关闭叠加层应该关闭叠加层并保留在第 2 页。
问题:回到第 2 页时,我仍然有转到覆盖路由的转发历史记录。
我找了很多方法都找不到删除转发历史记录的解决方案。
我的代码是这样的:如果显示覆盖:
this.props.router.push(this.props.router.getCurrentLocation().pathname + '#info')
然后我有一个代码可以在覆盖层关闭或按下后退按钮时返回:
onBackButtonEvent () {
if (this.props.renderOverlay) {
this.setState({
overlayRoutePushed: false
})
this.props.closeOverlay()
}
}
closeOverylayAndBack () {
this.setState({
overlayRoutePushed: false
})
this.props.closeOverlay()
this.props.router.goBack()
}
componentDidMount () {
window.onpopstate = this.onBackButtonEvent
}
为了用 window.onpopstate 检测后退按钮,我必须推送一条路线。我尝试在显示覆盖时用#info 替换Route,然后在按下时关闭覆盖,但我无法阻止 route.goBack().
的默认设置
有什么想法吗?
我找不到阻止转发或删除转发历史记录的方法,所以我最后的办法是使用散列删除,并在我向前点击时显示叠加层并在我返回时隐藏:
this.props.router.push({
pathname: this.props.router.getCurrentLocation().pathname,
state: {overlay: true}
})
这是为了删除 #,如果我不更改状态,推送实际上将使用 replace(),它不会让我处理 onPopState。
然后我来回pop的时候看看state有没有变化:
componentWillReceiveProps (nextProps) {
if (nextProps.router.location.state) {
if (nextProps.router.location.state.overlay) {
this.showOverylay()
}
}
}
要求: 当点击按钮推送#info 路由以显示全屏覆盖组件时,关闭模式或按返回应该关闭覆盖而不是转到上一页。
例如在第 1 页,转到第 2 页。在第 2 页,按 按钮显示覆盖。按后退键或关闭叠加层应该关闭叠加层并保留在第 2 页。
问题:回到第 2 页时,我仍然有转到覆盖路由的转发历史记录。
我找了很多方法都找不到删除转发历史记录的解决方案。
我的代码是这样的:如果显示覆盖:
this.props.router.push(this.props.router.getCurrentLocation().pathname + '#info')
然后我有一个代码可以在覆盖层关闭或按下后退按钮时返回:
onBackButtonEvent () {
if (this.props.renderOverlay) {
this.setState({
overlayRoutePushed: false
})
this.props.closeOverlay()
}
}
closeOverylayAndBack () {
this.setState({
overlayRoutePushed: false
})
this.props.closeOverlay()
this.props.router.goBack()
}
componentDidMount () {
window.onpopstate = this.onBackButtonEvent
}
为了用 window.onpopstate 检测后退按钮,我必须推送一条路线。我尝试在显示覆盖时用#info 替换Route,然后在按下时关闭覆盖,但我无法阻止 route.goBack().
的默认设置有什么想法吗?
我找不到阻止转发或删除转发历史记录的方法,所以我最后的办法是使用散列删除,并在我向前点击时显示叠加层并在我返回时隐藏:
this.props.router.push({
pathname: this.props.router.getCurrentLocation().pathname,
state: {overlay: true}
})
这是为了删除 #,如果我不更改状态,推送实际上将使用 replace(),它不会让我处理 onPopState。
然后我来回pop的时候看看state有没有变化:
componentWillReceiveProps (nextProps) {
if (nextProps.router.location.state) {
if (nextProps.router.location.state.overlay) {
this.showOverylay()
}
}
}