React Navigation on tab change

后端 未结 5 1234
清歌不尽
清歌不尽 2021-02-08 12:58

Without using Redux, how do I detect a tab change with a react navigation tab navigator?

I know I need to somehow use onNavigationStateChange but I can\'t figure out

相关标签:
5条回答
  • 2021-02-08 13:36
    export default () => <MyTabNav
        ref={(ref) => { this.nav = ref; }}
        onNavigationStateChange={(prevState, currentState) => {
           const getCurrentRouteName = (navigationState) => {
             if (!navigationState) return null;
             const route = navigationState.routes[navigationState.index];
             if (route.routes) return getCurrentRouteName(route);
             return route.routeName;
           };
        global.currentRoute = getCurrentRouteName(currentState);
      }}
    />;
    

    If you don't want to use redux, this is how you can store global information about the current route, so you can both detect a tab change and also tell which tab is now active.

    0 讨论(0)
  • 2021-02-08 13:39

    There's some long discussions about this from react-native issue 314, 486, 1335, and finally we got a better built in way to handle this, after Sep 27, 2017, react-navigation version v1.0.0-beta.13:

    New Features

    Accept a tabBarOnPress param (#1335) - @cooperka

    Usage:

    const MyTabs = TabNavigator({
      ...
    }, {
      tabBarComponent: TabBarBottom /* or TabBarTop */,
      tabBarPosition: 'bottom' /* or 'top' */,
      navigationOptions: ({ navigation }) => ({
        tabBarOnPress: (scene, jumpToIndex) => {
          console.log('onPress:', scene.route);
          jumpToIndex(scene.index);
        },
      }),
    });
    
    0 讨论(0)
  • 2021-02-08 13:47

    Actually, you can add an special listener in your component

    componentDidMount () {
        this.props.navigation.addListener('willFocus', (route) => { //tab changed });
    } 
    
    0 讨论(0)
  • 2021-02-08 13:51

    If you are using react-navigation version 5, then you can add tab-press listener right in your tab screen definition, to do some pre-processing, as mentioned in docs

    <Tab.Navigator>
        <Tab.Screen
            component={HomeScreen}
            name="HomeScreen"
            listeners={{
              tabPress: e => {
                if (userIsNotLoggedIn) {
                  // Prevent default action
                  e.preventDefault();
                  navigation.navigate("LoginScreen");
                }
              },
            }}
          />
          <Tab.Screen
            ../>
    </Tab.Navigator>
    

    Explanation: When Home tab will be clicked in BottomBar, and if user is not logged in, the HomeScreen won't open and instead LoginScreen will open(Note: LoginScreen is navigation name which will be registered some where with a screen). But if user is logged in, then it will behave normally.

    0 讨论(0)
  • 2021-02-08 13:53

    And if you intend to use the Window properties, you can easily do this in react.

    Keep a check whether window is present before return inside of render.

    if (typeof window !== "undefined") {
    window.addEventListener('visibilitychange, () => {
    window.document.title = window.document.hidden;
    console.log(document.hidden ? "Out" : "In");
    this.props.doFunction();
    

    }

    0 讨论(0)
提交回复
热议问题