React Router修改帖子隐私后goBack()跳转失效URL如何解决?
问题描述
现有路径为/post/public/:postId的公开博客帖子页,页面内的编辑按钮可跳转至/edit/:postId编辑页,用户可在编辑页修改帖子的隐私权限,将公开改为私有。修改完成后,原公开访问路径/post/public/:postId会失效,帖子的新访问路径变更为/post/private/:postId。
当前遇到的问题:在编辑页修改隐私权限后,点击取消按钮调用this.props.history.goBack()会跳转回已失效的公开路径,触发404错误。单独使用this.props.history.push()或this.props.history.replace()只能临时修复取消按钮的跳转问题,用户点击浏览器默认后退按钮时仍会跳转至失效页面。
可行实现方案
方案1:路由层加全局重定向兜底(最稳妥)
在帖子路径的路由守卫/前置校验逻辑中增加权限校验:
- 当用户访问
/post/public/:postId时,先请求接口查询当前帖子的实际隐私权限 - 如果查询到帖子已改为私有,直接调用
history.replace(/post/private/${postId})跳转到对应有效路径,公开路径同理反向处理
该方案属于兜底逻辑,不需要修改业务操作流程的代码,无论用户怎么操作浏览器历史栈,都不会出现访问无效路径的404问题,兼容性最强。
方案2:修改权限时替换历史栈中的旧路径
当用户在编辑页成功切换帖子隐私权限后,直接修改浏览器历史栈中的旧帖子路径:
- 利用
history.entries获取当前所有历史记录,找到旧的公开/私有帖子路径对应的条目 - 调用
history.replace将该条目替换为新的有效帖子路径
修改完成后,无论用户点击编辑页的取消按钮调用goBack(),还是点击浏览器自带的后退按钮,都会直接定位到新的有效路径,不会再访问到失效地址。
方案3:调整编辑页的跳转逻辑
从帖子详情页跳转进入编辑页时,使用history.replace而非history.push,同时把原帖子路径作为状态参数传入编辑页:
- 若用户未修改隐私权限,取消/保存时直接跳转回传入的原路径即可
- 若用户修改了隐私权限,取消/保存时跳转至新的有效帖子路径,同样用
history.replace完成跳转
该方案会直接把编辑页从历史栈中替换掉,用户完成操作后点击浏览器后退,会直接回到进入帖子详情页之前的页面,完全规避访问旧失效路径的可能。
内容的提问来源于stack exchange,提问作者Mitanshu
相关产品推荐
相关产品推荐

