【问题标题】:Couldn't get param in my tabs无法在我的标签中获取参数
【发布时间】:2018-07-20 06:41:22
【问题描述】:

我有带有 2 个选项卡的登录和主屏幕...我正在使用 navigate('MAIN',{user: user} 将用户传递到主屏幕,但我无法使用 this.props 在我的主屏幕中获取该用户.navigation.getParam('user')。我的错误是:未定义

当我调试时: Reactotron.log(this.props);我在构造函数的主屏幕中变得未定义。

我在 App.js 中的代码路由在哪里

 const Routes = createStackNavigator(
  {
    Login: {
      screen: Login,

      navigationOptions: ({ navigation }) => ({
          header: null,
        }),

    },
    Main: {
      screen: MainScreenRoutes,
      navigationOptions: ({navigation}) => ({
        header: null,
      }),
    },
  },
  {
    initialRouteName: 'Login',
    headerMode: 'screen',
    navigationOptions: {
      ...HeaderStyles,
      animationEnabled: true
    }
  }
);

export default Routes;

MainRoutes 中的代码:

let headerDefaultNavigationConfig = {
  header: props => <CustomHeader {...props} />,
  ...HeaderStyles
};

const Tab1 = createStackNavigator(
  {
    Domov: {
      screen: HomeScreen,
      navigationOptions: {
      },

    },
  },
  {
     navigationOptions: ({ navigation }) => ({
      ...headerDefaultNavigationConfig
    }),
  }
);

const Tab2 = createStackNavigator(
  {
    Dnevnik: {
      screen: Diary,
      navigationOptions: {

      },
    }
  },
  {
    navigationOptions: ({ navigation }) => ({
      ...headerDefaultNavigationConfig
    }),

  }
);

const bottomTabs = createBottomTabNavigator(
{
  Domov: Tab1,
  Dnevnik: Tab2,
},
{
  initialRouteName: "Domov",
  navigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, tintColor }) => {
        const { routeName } = navigation.state;
        let iconName;
        if (routeName === 'Domov') {
          //iconName = `home${focused ? '' : '-outline'}`;
          iconName='home';
        } else if (routeName === 'Dnevnik') {
          //iconName = `ios-calendar${focused ? '' : '-outline'}`;
          iconName='ios-calendar';
        } 

        // if focused return view with line
        if(focused) {
          return (
            <View style={styles.item}>
                <Icon name={iconName} style={{fontSize: 20, color: '#FFF'}} />
                <View style={styles.line}></View>
            </View>
          );
        } else {
          return(
            <Icon name={iconName} style={{fontSize: 20, color: '#FFF'}} />
          )
        }

      },

    }),
    tabBarPosition: 'bottom',
    tabBarOptions: {
      activeTintColor: 'white',
      showLabel: false,
      inactiveTintColor: '#4C2601',
      style: {
        backgroundColor: '#033D51',
      },
      labelStyle: {
        fontSize: 12,
        lineHeight: 30,
      },
    },
    swipeEnabled: true,

});

const All = createStackNavigator(
{
  "Home":{
    screen: bottomTabs,
    navigationOptions: {
        header: null,
    },
  },
  "MyProfil":{
    screen: MyProfil,
    navigationOptions: ({ navigation }) => ({
      ...headerDefaultNavigationConfig,
      headerTitle: 'Moj profil',

    }),
  }, 
  "Help": {
    screen: Help,
    navigationOptions: ({ navigation }) => ({
      ...headerDefaultNavigationConfig,
      headerTitle: 'Pomoč',

    }),
  }
},
{
    initialRouteName: 'Home',
    headerMode: 'screen',
    navigationOptions: {
      ...HeaderStyles,
      animationEnabled: true
    }
}



);


export default All;

HomeScreen 中的代码:该警报未定义

constructor(props) {
        super(props);

        let user = props.navigation.getParam('user');

        alert(user);



    }

Login.js 中的代码,我使用标签导航到该屏幕;

var obj = {
     id: json.user.id,
     lastname: json.user.lastname,
     name: json.user.name,
     email: json.user.email,
      user: json.user.user,
 };
 _storeData(obj);


 setTimeout(() => {
    navigate("Main",{user: JSON.stringify(obj)});
 },1300);  

【问题讨论】:

    标签: react-native react-navigation


    【解决方案1】:

    这很好:

      this.props.navigation.navigate("HomeScreen", { user :user });
    

    试试这个:

      let user = props.navigation.state.params.user ;
    

    编辑: 因为每个应用程序启动时只调用一次构造函数,所以试试这个

    import _ from "lodash";
    ...
    
    constructor(props){ super(props) ; console.log("main constructor ") ;  ... } 
    
    componentWillReceiveProps(nextProps) {
        console.log(JSON.stringify(nextProps.navigation.state.params)) 
        if (_.has(nextProps, "navigation.state.params.user")) {
          console.log(nextProps.navigation.state.params.user );
    
            this.setState({ user: nextProps.navigation.state.params.user })
    
        }
    }
    

    编辑 2

    在我的 createStackNavigator 中没有

    navigationOptions: { header: null},

    简单的stack1: { screen: stack1 },

    但是在我的堆栈屏幕组件中我有这个

    export default class stack1 extends React.PureComponent {
    
      static navigationOptions = ({ navigation }) => ({ header: null });
    
      constructor (props) {
        super(props);
    
        this.state = {  };
      }
      componentDidMount() {
        this.setState({ obsToEdit: this.props.navigation.state.params.obs, dataready: true });
      }
    
    }
    

    【讨论】:

    • 我也得到 undefined is not an object...因为我可以看到即使将参数传递给该路由也存在问题...:(
    • 你 npm install lodash 了吗?
    • console.log(JSON.stringify(props.navigation.state.params))的结果过去
    • pop:fn() popToTop:fn() push:fn() replace:fn() reset:fn() dismiss:fn() goBack:fn() navigate:fn() setParams: fn() ▶ state:{} router:undefined ▶ actions:{} getParam:fn() getChildNavigation: getChildNavigation() isFocused: isFocused() dispatch:fn() getScreenProps:fn() dangerouslyGetParent:fn() addListener: addListener( )
    • 实际上没有用户。当您进行导航呼叫时,您确定用户不为空吗?试试这个 this.props.navigation.navigate("HomeScreen", { user : "test ok" });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2021-12-11
    • 2021-08-02
    • 2020-12-14
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多