function closeQuickView() {
closeMe() // do whatever you need to close this component
}
useEffect(() => {
// Add a fake history event so that the back button does nothing if pressed once
window.history.pushState('fake-route', document.title, window.location.href);
addEventListener('popstate', closeQuickView);
// Here is the cleanup when this component unmounts
return () => {
removeEventListener('popstate', closeQuickView);
// If we left without using the back button, aka by using a button on the page, we need to clear out that fake history event
if (window.history.state === 'fake-route') {
window.history.back();
}
};
}, []);
4条答案
按热度按时间cpjpxq1n1#
如果您只是想在返回导航(POP操作)发生时运行函数,那么可能的解决方案是使用导出的
NavigationContext
为其创建自定义挂钩。示例:
用途:
如果您希望避免使用
UNSAFE_NavigationContext
上下文,那么另一种选择是创建一个可以使用自定义历史记录对象(即来自createBrowserHistory
)并使用普通历史记录的定制路由。详情见我的答案here。使用类型脚本更新
kadbb4592#
经过一段漫长的旅程,我终于想出了这个解决方案
kadbb4593#
对于这种情况,我想出了一个相当健壮的解决方案,只需使用浏览器方法,因为Reaction-Router-V6的API目前在这个部门相当粗略。
我推送一些与当前路线完全相同的虚假历史记录(也就是针对后退按钮的缓冲区)。然后,我监听PopState事件(Back按钮事件),并触发我需要的任何JS,在我的例子中,这会卸载组件。如果组件在没有使用Back按钮的情况下卸载,比如通过屏幕上的按钮或其他逻辑,我们只需使用useEffect的回调来清理我们的虚假历史。哎哟。所以看起来是这样的:
mgdq6dx14#
您可以使用RRDV6中的useNavigate钩子返回