React Native - Change background color in tabnavigator dynamically

后端 未结 3 1542
孤城傲影
孤城傲影 2021-01-06 15:33

i want to change my tab navigator background color dynamically in based on my API response so below is my code

_TabNavigator.js

cons         


        
相关标签:
3条回答
  • 2021-01-06 16:03

    What you need to do is set your tab component as a function and send the color as a parameter to that function. Try this:

    const MyTabnav = color => TabNavigator({
        ScreenOne: {
            screen: ({ navigation, screenProps }) => <ScreenOneNav screenProps={{ tabbarNavigation: navigation, ...screenProps }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'ScreenOne',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                        <Text style={[styles.tabText, { color: tintColor }]}>ScreenOne</Text>
                    </View>
                 )
            }
        },
        ScreenTwo: {
            screen: ({ navigation, screenProps }) => <ScreenOneNav screenProps={{ tabbarNavigation: navigation, ...screenProps, }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'ScreenOne',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                       <Text style={[styles.tabText, { color: tintColor }]}>ScreenTwo</Text>
                    </View>
                 )
            }
        },
        ScreenThree: {
            screen: ({ navigation, screenProps }) => <StockNotificationNav screenProps={{ tabbarNavigation: navigation, ...screenProps }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'Notifications',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                         <Text style={[styles.tabText, { color: tintColor }]}>ScreenThree</Text>
                    </View>
                )
            }
        },
    },
    {
    
        tabBarOptions: {
            //use the color you passed in the prop here:
            style: {
                backgroundColor: color,
                height: 55,
                borderTopColor: 'transparent',
                borderTopWidth: 1,
                paddingRight: 10,
                paddingLeft: 10,
                borderTopWidth: 1,
                borderTopColor: grayPlaceHolder
            },
            showLabel: false,
            showIcon : true,
        },
        tabBarComponent : TabBarBottom,
    
        initialRouteName: 'ScreenTwo',
        tabBarPosition: 'bottom',
        animationEnabled: false,
        swipeEnabled: false
        }, []);
    
    
    var styles = StyleSheet.create({
        tabText: {
            fontSize: 10,
            fontWeight: "600",
            flex: 4,
        },
        tabViewBox: {
            flex: 1,
            alignItems: "center",
        },
        tabIcon: {
            flex: 5,
            alignSelf: "center",
            marginTop: 10
        },
    });
    export default MyTabNav;
    


    Then where you use MyTabnav pass the color as a param to it. for example

    export default class App extends Component<{}> {
        constructor(props) {
            super(props);
            this.state = {
                color: 'black'
            };
        }
        getRandomColor = () => {
            var letters = '0123456789ABCDEF';
            var color = '#';
            for (var i = 0; i < 6; i++) {
                color += letters[Math.floor(Math.random() * 16)];
            }
            return color;
        };
        onPress = () => {
            this.setState({
                color: this.getRandomColor()
            });
        };
        render() {
            const Tabs = MyTabnav(this.state.color);
            return (
                <View style={{ flex: 1 }}>
                    <Button onPress={this.onPress} title="Click me" />
                    <Tabs />
                </View>
            );
        }
    }
    
    0 讨论(0)
  • 2021-01-06 16:13

    what you can do is make one custom tabBar component and using javaScript immutability concept you can override style of tabBarOptions.

         const MyTabnav = TabNavigator({ScreenOne: {
            screen: ({ navigation, screenProps }) => <ScreenOneNav screenProps={{ tabbarNavigation: navigation, ...screenProps }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'ScreenOne',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                         <Text style={[styles.tabText, { color: tintColor }]}>ScreenOne</Text>
                    </View>
                )
            }
        },
        ScreenTwo: {
            screen: ({ navigation, screenProps }) => <ScreenOneNav screenProps={{ tabbarNavigation: navigation, ...screenProps, }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'ScreenOne',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                        <Text style={[styles.tabText, { color: tintColor }]}>ScreenTwo</Text>
                    </View>
                )
            }
        },
        ScreenThree: {
            screen: ({ navigation, screenProps }) => <StockNotificationNav screenProps={{ tabbarNavigation: navigation, ...screenProps }} onNavigationStateChange={null} />,
            navigationOptions: {
                tabBarLabel: 'Notifications',
                tabBarIcon: ({ tintColor }) => (
                    <View style={[styles.tabViewBox]}>
                         <Text style={[styles.tabText, { color: tintColor }]}>ScreenThree</Text>
                    </View>
                )
            }
        },
        },
         {
    
            tabBarOptions: {
    
                style: {
                    backgroundColor: white,
                    height: 55,
                    borderTopColor: 'transparent',
                    borderTopWidth: 1,
                    paddingRight: 10,
                    paddingLeft: 10,
                    borderTopWidth: 1,
                    borderTopColor: grayPlaceHolder
                },
                showLabel: false,
    
    
             showIcon : true,
            },
    
    //Here Goes Your CustomTabBar Component 
            tabBarComponent : CustomTabBarComponent,
            initialRouteName: 'ScreenTwo',
            tabBarPosition: 'bottom',
            animationEnabled: false,
            swipeEnabled: false
        }, []);
    

    CustomTabBarComponent.js

         const TabBar = (props) => {
              const { navigationState } = props;
              let newProps = props;
    
                newProps = Object.assign(
                  {},
                  props,
                  {
                    style: {
    
             // get value from redux store and set it here 
                      backgroundColor: 'rgba(0,0,0,0.1)',
                      position: 'absolute',
                      bottom: 0,
                      left: 0,
                      right: 0
                    },
                    activeTintColor: '#fff',
                    inactiveTintColor: '#bbb',
                  },
                );
    
    
              return <TabBarBottom {...newProps} />;
            };
    

    Now You can connect this CustomTabBarComponent with Redux store and can change the value of whatever Property you want.

    0 讨论(0)
  • 2021-01-06 16:22

    try using

    const tabBarOptions = {
    // setting height 'null', and top 0 will change the color of pressed tab
       indicatorStyle: {
         height: null,
         top: 0,
         backgroundColor: "red",
         borderBottomColor: "black",
         borderBottomWidth: 3,
       },
       activeTintColor: "black",
       pressColor: "white",
       style: {
         backgroundColor: "#ddc8be",
       },
       labelStyle: { fontSize: 13 },
    };
    
    0 讨论(0)
提交回复
热议问题