reactjs - 在反应应用程序中拦截返回事件以确认保存
问题描述
我正在使用 expo.io 构建一个反应原生应用程序。
该应用程序使用堆栈导航器在页面(卡片)之间移动。
我的问题是我有一个页面,用户可以在其中创建新项目,并且我想在他们离开页面时保存这些项目。我不想保存所有更改,而是想在离开页面之前提示用户是否要保存更改,以便他们有机会放弃所做的任何更改。
我无法找到退出页面的事件,我可以连接并提示用户是否要保存更改?我发现最接近我想做的是在backhandler中,但这仅适用于 Android 后退按钮。
如果用户使用卡片标题中的后退按钮返回,或者他们使用滑动手势,有没有办法做类似的事情?
解决方案
使用NavigationEvents。将事件侦听器添加到您的组件。
onWillFocus - 事件监听器
onDidFocus - 事件监听器
onWillBlur - 事件监听器
onDidBlur - 事件监听器
例如,下一个屏幕聚焦时会触发以下内容。在另一个屏幕中,将用户的更改保存在临时存储中,当他们导航回来时,获取那些未保存的更改并提示用户是否要保存。
focusSubscription = null;
onWillFocus = (payload) => {
if (payload && payload.action && payload.action.type && payload.action.type === 'Navigation/BACK') {
// get values from storage here
// if there were unsaved changes prompt the user if they want to those changes or not
}
};
componentDidMount = () => {
this.focusSubscription = this.props.navigation.addListener(
'willFocus',
this.onWillFocus,
);
}
componentWillUnmount = () => {
this.focusSubscription && this.focusSubscription.remove();
this.focusSubscription = null;
};
推荐阅读
- javascript - 每次读取数据块后等待 - Node JS
- ios - 将PNG图像读取为NSData,出现一些额外的字节
- node.js - 是否可以在不使用 sequelize-typescript 框架的情况下在 NodeJS 中使用 Sequelize typescript?
- java - 使用 MSI 从本地运行的 java 应用程序连接到 Azure Keyvault 的方法
- python - 使用python在JSON循环中解析文件
- ruby-on-rails - 如何在rails中使用级联删除将列添加为外键
- ruby - 如何在map方法中返回一行两次
- spring-boot - 无法检索远程 JWK 集:login.microsoftonline.com
- c# - 将 HTML 页面作为最后一页添加到 PDF 文档
- mongodb - $在 mongo 数据库中添加值