【问题标题】:Push a state in react-navigation without refreshing screen在反应导航中推送状态而不刷新屏幕
【发布时间】:2018-04-14 11:29:51
【问题描述】:

我有一个使用 React Navigation 的应用程序,我需要能够执行以下操作:

  • 导致自动状态转换,无需重新加载当前屏幕(例如通过更改参数)
  • 能够使用“后退”按钮来反转此转换

这很复杂,因为我使用的是嵌套在 TabNavigator 中的 StackNavigator:处理此类内部操作的常用方法是简单地监听后退按钮事件(在componentDidMount 并在 componentWillUnmount 中删除它),但不幸的是,当我这样做时,我的处理程序会在其他选项卡打开时触发,这让用户感到困惑。

我尝试过使用navigation.setState,但是当我使用它时,它不会向导航堆栈添加任何内容,因此无法通过按后退按钮撤消状态更改。

我也尝试过使用navigation.push,但这会导致我的屏幕的一个新实例被创建为具有不同的组件状态,并且转换是可见的,但这不起作用。

有没有人对我如何做到这一点有任何建议?

【问题讨论】:

    标签: react-native react-navigation


    【解决方案1】:

    您仍应考虑以自己的方式处理此内部操作。但navigation. addListener 可能不适合这里。相反,您应该将标题中的后退按钮组件替换为您自己的组件,并添加您自己的 onPress 属性。

    例子:

    import {
      HeaderBackButton
    } from 'react-navigation'
    
    class MyComponent extends Component {
    
      static navigationOptions = ({ navigation }) => {
        const params = navigation.state.params
    
        class BackButton extends React.Component {
          goBack = () => {
            if (params.isInternalGoBack) {
              // do some internal goback action
            } else {
              this.props.onPress() // original Back button behavior
            }
          }
          render () {
            return (
              <HeaderBackButton {...this.props} onPress={this.goBack} />
            )
          }
        }
    
        return {
          headerLeft: BackButton
        }
      }
      ...
    }
    

    然后您可以使用this.props.navigation.setParams({ isInternalGoBack: true }) 来控制返回按钮的行为。

    【讨论】:

    • 如何处理这个方案中的硬件后退按钮?我的主要问题是,当相关屏幕当前不可见时,我不知道如何防止它触发。
    • 同意,这是一个不错的解决方法,但如果它不能与硬件后退按钮一起使用,那就不够了
    • @Jules 你找到更好的解决方法了吗?,我面临着完全相同的用例,想知道如何用 react-navigation 解决它
    • @tdurand - 不;发布此问题后不久,客户要求重新设计相关应用的用户界面,这意味着不再需要。
    • @Jules 谢谢,我会做这样的事情,还可以用这个插件来处理后退按钮:github.com/vonovak/react-navigation-backhandler .. 不会超级漂亮,但应该可以工作......
    猜你喜欢
    • 2018-05-05
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多