reactjs - 在 react 应用程序中拦截返回事件以确认保存

标签 reactjs react-native react-navigation expo

我正在使用 expo.io 构建一个 React Native 应用程序。

该应用程序正在使用堆栈导航器在页面(卡片)之间移动。

我的问题是,我有一个页面,用户可以在其中创建新项目,而我想在他们离开页面时保存这些项目。 我不想保存所有更改,而是想在离开页面之前提示用户是否要保存更改,以便他们有机会放弃所做的任何更改。

我无法找到退出页面的事件,我可以 Hook 并提示用户是否要保存更改? 我发现最接近我想做的事情是在backhandler中,但这仅适用于 Android 后退按钮。

如果用户使用卡片标题中的后退按钮返回,或者使用滑动手势返回,是否有办法执行类似的操作?

最佳答案

使用NavigationEvents 。将事件监听器添加到您的组件。

onWillFocus - event listener

onDidFocus - event listener

onWillBlur - event listener

onDidBlur - event listener

例如,当下一个屏幕聚焦时,将触发以下内容。在另一个屏幕中,将用户的更改保存在临时存储中,当他们返回时,获取那些未保存的更改并提示用户是否要保存或不是。

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;
};

Demo

关于reactjs - 在 react 应用程序中拦截返回事件以确认保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56467184/

相关文章:

ios - 获取在 React Native 上运行的 iOS Today Widget 扩展

react-native - react 导航-5 : Multiple MaterialTopTabNavigator in the same screen

typescript - react 导航 + TypeScript 错误 : Type 'EventStackParams' does not satisfy the constraint 'Record<string, object | undefined>'

ios - 为什么我们在react-native中使用ProgressViewIOS组件的progressImage属性?

reactjs - React 文件上传返回未定义

javascript - useEffect hook 完成后如何渲染组件?

reactjs - 如何使用 Material UI 主题使所有按钮文本变为粗体

react-native - 输入每个字符后,我的 React Native 文本输入失去焦点

javascript - 为 flatlist 的所有项目创建一个状态数组。 ( react native )

react-native - React Navigation 5 处理模式、底部选项卡和堆栈