React Native - 动态更改tabnavigator中的背景颜色

时间:2018-02-28 09:55:30

标签: react-native tabnavigator stack-navigator

我想根据我的API响应动态更改我的标签导航器背景颜色,所以下面是我的代码

_TabNavigator.js

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,
    },
    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 StocksTabNav;

我想在我的ScreenTwo.js文件中更改我的tabnavigtor背景颜色,其中包含API响应代码,因为它的tabnavigator背景颜色(backgroundColor)应根据API更改为黑色或白色回应所以我怎么能实现这个目标?你的所有建议都很明显

根据Rahul的更新代码建议发出以下警告信息

enter image description here

3 个答案:

答案 0 :(得分:3)

您需要做的是将标签组件设置为函数,并将颜色作为参数发送到该函数。试试这个:

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;


然后在哪里使用MyTabnav将颜色作为参数传递给它。例如

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>
        );
    }
}

答案 1 :(得分:3)

您可以做的是制作一个自定义tabBar组件并使用javaScript immutability概念,您可以覆盖tabBarOptions的样式。

 
     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} />;
        };

<强> CustomTabBarComponent.js

documentation

现在,您可以将此CustomTabBarComponent与Redux存储连接,并可以更改所需属性的值。

答案 2 :(得分:0)

尝试使用

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 },
};