【问题标题】:How to get current navigation state如何获取当前导航状态
【发布时间】:2023-03-17 20:24:02
【问题描述】:

我正在使用来自 https://reactnavigation.org/docs/navigators/tab 的 React Navigation 的选项卡导航器,当我在选项卡屏幕之间切换时,我在 this.props.navigation 中没有任何导航状态。

标签导航器

    import React, { Component } from 'react';
    import { View, Text, Image} from 'react-native';
    import DashboardTabScreen from 'FinanceBakerZ/src/components/dashboard/DashboardTabScreen';
    import { TabNavigator } from 'react-navigation';


       render() {
        console.log(this.props.navigation);   

        return (
          <View>
              <DashboardTabNavigator  />
          </View>
        );
      }



    const DashboardTabNavigator = TabNavigator({
      TODAY: {
        screen: DashboardTabScreen
      },
      THISWEEK: {
        screen: DashboardTabScreen
      }
    });

仪表板屏幕:

import React, { Component } from 'react';
import { View, Text} from 'react-native';

export default class DashboardTabScreen extends Component {
  constructor(props) {
    super(props);

    this.state = {};
    console.log('props', props);

  }

  render() {
    console.log('props', this.props);
    return (
      <View style={{flex: 1}}>
        <Text>Checking!</Text>
      </View>
    );
  }
}

当它首先呈现组件时,我在仪表板屏幕上获得了道具,但是当我切换选项卡时我没有得到道具。 我需要获取当前的屏幕名称,即今天或本周。

【问题讨论】:

    标签: reactjs react-native react-redux react-navigation


    【解决方案1】:

    您的问题与“屏幕跟踪”有关,react-navigation 对此有官方指南。你可以使用onNavigationStateChange 来跟踪屏幕,使用内置的导航容器或者编写一个 Redux 中间件来跟踪屏幕,如果你想与 Redux 集成。更多详细信息可以在官方指南中找到:Screen-Tracking。以下是使用 onNavigationStateChange 的指南中的示例代码:

    import { GoogleAnalyticsTracker } from 'react-native-google-analytics-bridge';
    
    const tracker = new GoogleAnalyticsTracker(GA_TRACKING_ID);
    
    // gets the current screen from navigation state
    function getCurrentRouteName(navigationState) {
      if (!navigationState) {
        return null;
      }
      const route = navigationState.routes[navigationState.index];
      // dive into nested navigators
      if (route.routes) {
        return getCurrentRouteName(route);
      }
      return route.routeName;
    }
    
    const AppNavigator = StackNavigator(AppRouteConfigs);
    
    export default () => (
      <AppNavigator
        onNavigationStateChange={(prevState, currentState) => {
          const currentScreen = getCurrentRouteName(currentState);
          const prevScreen = getCurrentRouteName(prevState);
    
          if (prevScreen !== currentScreen) {
            // the line below uses the Google Analytics tracker
            // change the tracker here to use other Mobile analytics SDK.
            tracker.trackScreenView(currentScreen);
          }
        }}
      />
    );
    

    【讨论】:

      【解决方案2】:

      先检查所有属性,比如

      <Text>{JSON.stringify(this.props, null, 2)}</Text>
      

      上面的 json 数组将显示您在 routeName 索引下的当前导航状态,即

      this.props.navigation.state.routeName
      

      【讨论】:

      【解决方案3】:

      您是否尝试在路由对象中定义 navigationOptions?

      const DashboardTabNavigator = TabNavigator({
        TODAY: {
          screen: DashboardTabScreen
          navigationOptions: {
           title: 'TODAY',
          },
        },
      })
      

      您还可以将 navigationOptions 设置为将与导航对象一起调用的回调。

      const DashboardTabNavigator = TabNavigator({
        TODAY: {
          screen: DashboardTabScreen
          navigationOptions: ({ navigation }) => ({
           title: 'TODAY',
           navigationState: navigation.state,
          })
        },
      })
      

      阅读更多关于 navigationOptions https://reactnavigation.org/docs/navigators/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        相关资源
        最近更新 更多