首页 > 解决方案 > 如何将道具传递给 createBottomTabNavigator 的所有选项卡

问题描述

我的应用程序使用以下命令createBottomTabNavigator从 a调用 a由 2 个选项卡组成,一个是 Stack Navigator,第二个只是一个 React 组件。当我导航到Stack Navigator 时,我传入的道具可用,但如果我选择选项卡导航器的第二个选项卡,则道具不可用。createSwitchNavigatorthis.props.navigation.navigate('AppMenu', {UserName: 'First Name'});createBottomTabNavigatorinitialRouteName

有没有一种方法可以在渲染时将道具传递给底部选项卡导航器的所有选项卡?

这是应用程序的图表,以及可以在 Snack 中运行的示例代码。

在此处输入图像描述

import React from 'react';
import { Text, View, Button } from 'react-native';
import { createBottomTabNavigator, createStackNavigator, createSwitchNavigator } from 'react-navigation';

class LoginScreen extends React.Component {
  _navToMain = () => {
    console.log('Login Screen: Passing user: First Name');
    this.props.navigation.navigate('AppMenu', {UserName: 'First Name'});
  }
  render () {
    return (
      <View style={{flexDirection: 'column', paddingTop:20}}>
        <Text>Pass UserName prop to createBottomTabNavigator</Text>
        <Button title='Login!' onPress={this._navToMain}/> 
      </View>
    )
  }
}

class SyncScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    return {
      headerTitle: 'Sync Screen',
    };
  };
  render () {
    return (  
      <View style={{flexDirection: 'column', paddingTop:20}}>
        <Text>Sync Screen Navigation Prop UserName (missing!): {JSON.stringify(this.props.navigation.getParam('UserName'))}</Text>          
        <Button title='Test Button' onPress={() => {}} />
      </View>
    );
  }
}

class AppMenuScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    return {
      headerTitle: 'Stack Navigator',
    };
  };

  _navToOne = () => {
    console.log('Going to Stack One')
    this.props.navigation.navigate('StackOne', {UserName: this.props.navigation.getParam('UserName')});
  }

  render () {
    return (   
      <View style={{flexDirection: 'column'}} >  
        <Text>App Menu Navigation Prop UserName passed from SwitchNavigator: {JSON.stringify(this.props.navigation.getParam('UserName'))}</Text>
        <Button title='Screen one' onPress={this._navToOne} />         
      </View> 
    )
  }
}

class StackOneScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    return {
      headerTitle: 'Stack One Screen',
    };
  };
  render () {
    return (         
      <View style={{flexDirection: 'row'}} >  
        <Text>Stack One Screen Navigation Props: {JSON.stringify(this.props.navigation.getParam('UserName'))}</Text>       
      </View> 
    )
  }
}

const AppStack = createStackNavigator(
  {
    AppMenu: AppMenuScreen,
    StackOne: StackOneScreen,    
  },
  {
    initialRouteName: "AppMenu",
    navigationOptions: {
      headerTintColor: "#a41034",
      headerStyle: {
        backgroundColor: "#fff"
      }
    }
  }
);

const MainTabs = createBottomTabNavigator(
  {
    'Apps': { screen: AppStack },
    'Sync': { screen: SyncScreen },
  },
  {
    navigationOptions: ({ navigation }) => ({
      title: navigation.state,      
      tabBarIcon: ({ focused, horizontal, tintColor }) => {
        const { routeName } = navigation.state;
      }
    }),
    tabBarOptions: {
      activeTintColor: 'red',
      inactiveTintColor: 'gray',
      tabBackgroundColor: 'black',      
      labelStyle:{
        fontSize: 24,
        marginBottom:10,
      }       
    },
    animationEnabled: true,
    swipeEnabled: false,
  }
);

const AppNavigator = createSwitchNavigator(
  {
    Login: LoginScreen,
    Main: MainTabs
  },
  {
    initialRouteName: 'Login',
    backBehavior: "initialRoute",
  }
);

export default class App extends React.Component {
  render() {
    return (
      <AppNavigator />
    );
  }
}

包.json

"react": "16.5.0",
"react-native": "0.57.1",    
"react-navigation": "^2.0.0"

标签: react-nativereact-navigation

解决方案


您可以使用导航传递道具

 _navToOne = () => {
  console.log("Going to Stack One");
  this.props.navigation.navigate({
    routeName: "StackOne",
    params: { UserName: this.props.navigation.state.params.UserName }
  });
};

如果您想访问使用导航传递的道具

this.props.navigation.state.params.PROPNAME
// PROPNAME is the prop you passed and want to get

推荐阅读