【发布时间】:2018-05-09 11:57:48
【问题描述】:
我一直在尝试在单击“后退按钮”时向用户显示确认弹出窗口。我正在使用React Router v3,所以我不能使用 React Router v4 的<Prompt/>。
这是我想要实现的目标:
- 当用户点击“返回”或“刷新”表单上未保存的数据时,浏览器会显示一个确认弹出窗口“是”和“否”以离开或留下。
我尝试了几件事:
1) setRouteLeaveHook (React Router v3) React Router v3 doc
componentDidUpdate() {
...
if (isDirty) // denoting that there is unsaved work
this.props.router.setRouteLeaveHook(
this.props.route,
() => { return 'Unsaved data will be lost' }
);
}
- 在这种情况下,我用
withRouter包装了我的组件,这样我就可以访问this.props.router - 我无法实现我的目标,因为我执行了以下操作
- 尝试从
www.website.com/about到www.website.com单击“返回” - 弹出消息显示,我单击“否”以留在同一页面上
- 虽然内容(组件)相同,但url改回
www.website.com
- 尝试从
2) 'beforeunload' 和 'popstate'
componentDidUpdate() {
...
if (isDirty) // denoting that there is unsaved work
window.addEventListener('beforeunload', this.handleBeforeUnload);
window.addEventListener('popstate', this.handleOnPopState);
}
}
handleBeforeUnload = e => {
e.preventDefault();
const msg = 'Are you sure?';
e.returnValue = msg;
return msg;
}
handleOnPopState = e => {
e.preventDefault();
// how can I prevent here?
}
- 这里会弹出确认消息,当我尝试
reload时,它应该会正常工作。 - 但是,当我单击返回按钮时,没有确认也不会阻止“返回”。
防止用户意外导航的最佳方法是什么? 任何帮助或建议表示赞赏!
附言我无法升级到 React Router v4
【问题讨论】:
标签: javascript reactjs react-router