gpt4 book ai didi

javascript - 如何将自定义组件添加到 createMaterialTopTabNavigator 选项卡栏

转载 作者:行者123 更新时间:2023-12-04 23:36:12 24 4
gpt4 key购买 nike

我正在使用 createMaterialTopTabNavigator来自 react-navigation并尝试通过在其顶部添加一些组件来自定义标签栏。

正如您在此处的指南中所见:

https://reactnavigation.org/docs/en/material-top-tab-navigator.html#docsNav

有一个选项叫做 tabBarComponent可以通过它来创建您自己的标签栏。但是,它完全覆盖了我不想要的标签栏。

我想在选项卡栏的顶部添加一个自定义组件,然后将默认选项卡及其标签放在下面。

谁能告诉我如何向标签栏添加组件的示例?

例如,下面的代码将标签替换为 My Custom Component文本,但我怎样才能同时拥有它们? (自定义组件和选项卡)

const myNavigation = createMaterialTopTabNavigator({
firstTab: FirstTabScreen,
secondTab: SecondTabScreen,
thirdTab: ThirdTabScreen,
},
{
tabBarComponent: props => (
<View><Text>My Custom Component</Text></View>
)
});

最佳答案

创建自定义标签栏组件并不难,下面是我为我正在处理的项目创建的自定义标签栏的简化示例。

但实际上并没有那么多,你的标签栏组件接收到一个导航 Prop ,它保存了你在 createMaterialTopTabNavigator 中设置的不同路线。 .因此,您只需遍历这些路由并为每个路由显示一个标签栏项目。

CustomTabBar.jsx

export default class CustomTabBar extends React.Component {

render() {

const {navigation} = this.props;
const routes = navigation.state.routes;

return (
<SafeAreaView style={{backgroundColor: 'blue'}}>
<View style={styles.container}>
{routes.map((route, index) => {
return (
<View style={styles.tabBarItem}>
<CustomTabBarIcon
key={route.key}
routeName=route.routeName
onPress={() => this.navigationHandler(index)}
focused={navigation.state.index === index}
index={index}
/>
</View>
);
}
</View>
</SafeAreaView>
);
}

navigationHandler = (routeName) => {
this.props.navigation.navigate(routeName);
}
}

const styles = StyleSheet.create({

container: {
flexDirection: 'row',
alignContent: 'center',
height: 56,
width: '100%',
paddingHorizontal: 16,
backgroundColor: 'blue',
},
tabBarItem: {
flex: 1,
alignItems: 'center'
}
});

CustomTabBarItem.jsx
class CustomTabBarIcon extends React.PureComponent {

render() {

const {index, focused, routeName} = this.props;
let icon = '';

switch (index) {
case 0:
icon = 'a';
break;

case 1:
icon : 'b';
break;

case 2:
icon = 'c';
break;

default:
iconName = 'a';
}

return (
<TouchableWithoutFeedback
onPress={() => this.onSelect(routeName)}
>
<View style={[styles.container, focused ? styles.active : styles.inactive]}>
<View style={styles.icon}>
<Icon name={icon} color='white' size={24}/>
</View>
<Text style={styles.textStyle}>{routeName}</Text>
</View>
</TouchableWithoutFeedback>
);
}

onSelect = (routeName) => {
this.props.onPress(routeName);
}
}

const styles = StyleSheet.create({

container: {
flex: 1,
alignItems: 'center'
},
active: {
borderTopWidth: 3,
borderColor: 'white'
},
inactive: {
borderTopWidth: 3,
borderColor: 'blue'
},
textStyle: {
color: 'white',
fontSize: 13
}
});

关于javascript - 如何将自定义组件添加到 createMaterialTopTabNavigator 选项卡栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54409280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com