react-router中useHistory.goBack()触发两次导致回退两页,是什么原因?
react-router
history.goBack() 回退两页问题原因排查 - 事件重复绑定:
history.goBack()的触发逻辑(比如按钮点击事件、系统返回手势/键盘返回监听事件)被重复注册,单次用户操作会触发两次回退调用。常见于事件监听未正确清理的场景:比如在useEffect中绑定事件后没有返回销毁函数,组件多次重渲染就会叠加绑定多份相同的监听逻辑。 - 自定义返回逻辑与浏览器默认行为冲突:如果手动监听了
popstate事件来自定义返回逻辑,且在回调中调用了history.goBack(),此时浏览器本身的默认回退行为已经会回退1页,加上手动调用的1次,累计就会回退2页。这种情况需要在自定义监听逻辑中添加e.preventDefault()阻止默认行为。 - 历史栈存在隐式多余记录:执行
history.push(/my-url)时,因为路由重定向、重复调用push等原因,历史栈中被额外插入了一条你感知不到的路由记录:- 比如你push的路径配置了自动重定向规则,且重定向用了
push而非replace,会额外新增一条重定向路由记录 - 比如push逻辑被重复执行两次,但两次跳转路径对应的页面完全相同,你感知不到页面变化,但历史栈已经多了一条相同记录
- 比如你push的路径配置了自动重定向规则,且重定向用了
- 嵌套路由多层返回逻辑叠加:如果当前页面属于嵌套子路由,父子组件同时绑定了同个返回触发源的监听,单次返回操作会先后触发父子组件的两次
history.goBack()调用,直接回退两页。 - iframe历史记录干扰:如果当前页面嵌套了可跳转的iframe,iframe的跳转记录会被计入上层窗口的历史栈,回退时会先回退iframe的历史,再回退外层页面的历史,看起来像是一次操作回退了两页。
内容的提问来源于stack exchange,提问作者RMT
相关产品推荐
相关产品推荐

