【问题标题】:need to display the header in all screen on react native navigation V5需要在反应原生导航V5上的所有屏幕中显示标题
【发布时间】:2021-08-30 18:05:51
【问题描述】:

我有以下 header.js

  import React from 'react';
import {View, Text, StyleSheet, Image} from 'react-native';
import {MaterialCommunityIcons} from '@expo/vector-icons';


export default function header({navigation}, title) {

    const openMenu =() => {
        navigation.openDrawer()
    }
    return (
        <View style={styles.header}>
            <MaterialCommunityIcons name='menu' 
    size={24} color='black'
    onPress={openMenu}
    style={styles.icon}
    />
            <View style={styles.headerTitle}>
            <Image style={styles.logo} source={require('../assets/oau-ico-hat.png')}/>
                <Text style={styles.headerText}>title={title}</Text>
               
                {/*  */}
                
            </View>
                  </View>
    )
}
const styles = StyleSheet.create({
    header:{
     width:'100%',
        height: '100%',
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'center',
        
        
    },
    headerText:{
        fontWeight: 'bold',
        fontSize: 20,
        color: '#333',
        letterSpacing: 1,
        marginTop:8,
        marginHorizontal: 50,
        marginLeft:10,
    },
    logo: {
        width: 40,
        height: 40,
        
       
    },
    icon:{
        position:'absolute',
        left: 0.7,
    },
    headerTitle:{
        flexDirection:'row',
       
    },
})

然后我有以下 App.js

const Drawer = createDrawerNavigator();
const DrawerNavigator=() => {
  return (
    <Drawer.Navigator
     drawerContent={props => <DrawerContent {...props}
     />}
     >
      <Drawer.Screen name="Home" component={StackNavigator}
     
      
      />
      <Drawer.Screen name="Faculties" component={Faculty}
      />
    </Drawer.Navigator>
  )
}
const Tab = createBottomTabNavigator();
const TabNavigator = ({navigation}) => (
  <Tab.Navigator 
  screenOptions={{
    headerStyle:{backgroundColor: "tomato" , elevation:0},
  headerTintColor:"#fff",
   headerTitleAlign:'center',
   
   headerTitle: () => <Header navigation={navigation} title='O.A.U'/>


 }}>
            <Tab.Screen name="Home" component={DrawerNavigator} />
     <Tab.Screen name="Faculties" component={Faculty} 
     
     /> 
    </Tab.Navigator>
)


const Stack = createStackNavigator();
const StackNavigator = ({navigation}) => (
  <Stack.Navigator   

  screenOptions={{
     headerStyle:{backgroundColor: "tomato" , elevation:0},
   headerTintColor:"#fff",
    headerTitleAlign:'center',
    
     headerTitle: () => <Header navigation={navigation} title='O.A.U'/>


  }}
  >
    <Stack.Screen name="Home" component={Home}
    options={() =>  {<Header navigation={navigation} title='O.A.U'/>}}
    
  
    />
    <Stack.Screen name="TabsBottom" component={Faculty}
   
    />
    
  </Stack.Navigator>
);

  

const styles = StyleSheet.create({
  header:{
   
    alignItems:'center',
},
})
export default function App() {
  return (
    <NavigationContainer>
      
     <TabNavigator/>
    </NavigationContainer>  
  );
}

我有 homeStack.js,在 React Navigation V4 中它的工作方式如下:知道如何在 V% react-navigation 中使其工作

import React from 'react';
import {createStackNavigator} from '@react-navigation/stack';

import Header from '../shared/header';
import Home from '../screens/homeScreen';
import Faculty from '../screens/faculties'

const screens ={
    Home: {
        screen: Home,
        screenOptions:({ navigation } )=> {
            return {
            headerTitle: () => <Header navigation={navigation} title='O.A.U'/>,
        }
        }
    },
   
    Faculty: {
        screen: Faculty,
        navigatioptions:({ navigation } )=> {
            return {
            headerTitle: () => <Header navigation={navigation} title='O.A.U'/>,
        }
        }
    }
}

const HomeStack = createStackNavigator();
export default HomeStack;

我有一个用于抽屉菜单的 drwer.js,如下所示:

import React from "react";
import { StyleSheet, View } from "react-native";
import {
  DrawerContentScrollView,
  DrawerItem,
  DrawerItemList,
} from "@react-navigation/drawer";

import {
  Avatar,
  Title,
  Caption,
  Paragraph,
  Drawer,
  Text,
  TouchableRipple,
  Switch,
} from "react-native-paper";
import { MaterialCommunityIcons, FontAwesome5 } from "@expo/vector-icons";

import Home from './homeStack'

export function DrawerContent({ ...props }) {
  return (
    <View style={{ flex: 1 }}>
      <DrawerContentScrollView {...props}>
        {/* <DrawerItemList {...props}/> */}
        <DrawerItem
          icon={({ color, size }) => (
            <MaterialCommunityIcons name="home" color={color} size={size} />
          )}
          label="Home"
          onPress={() => props.navigation.navigate("Home")}
        />
        <DrawerItem
          icon={({ color, size }) => (
            <FontAwesome5 name="university" color={color} size={size} />
          )}
          label="Faculties"
          onPress={() => props.navigation.navigate("Faculties")}
        />
      </DrawerContentScrollView>
    </View>
  );
}

我的问题如下: 1.如何在所有屏幕中显示标题,因为标题将包括拉出抽屉菜单的菜单汉堡? 2.从选项卡单击学院菜单时,除非我从选项卡导航单击主菜单,否则抽屉菜单不起作用,我的嵌套导航是否正确或我哪里出错了? P/S:请注意这是我第一次使用 react 开发移动应用程序。 你可以看看github,看看你是否可以从那里得到帮助@https://github.com/sudani/Uni_app.git

【问题讨论】:

    标签: reactjs react-native navigation navigation-drawer react-navigation-v5


    【解决方案1】:

    在过去 2 天寻找答案后,我发现了很棒的 youtube 教程,我对规则发布链接一无所知,但在这里我设法做到了: 删除所有堆栈屏幕,标签屏幕以分离文件,然后将文件导入 App.js: 文件如下:

    import React from 'react';
    import {createStackNavigator} from '@react-navigation/stack';
    import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs';
    import Icon from 'react-native-vector-icons/Ionicons';
    import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
    
    import HomeScreen  from './homeScreen'
    import FacultyScreen  from './faculties';
    
    const HomeStack = createStackNavigator();
    const FacultyStack = createStackNavigator();
    const Tab = createMaterialBottomTabNavigator();
    const MainTabScreen =() => (
        <Tab.Navigator
          initialRouteName="Home"
          activeColor="#fff"
          barStyle={{ backgroundColor: 'tomato' }}
        >
          <Tab.Screen
            name="Home"
            component={HomeStackScreen}
            options={{
              tabBarLabel: 'Home',
              tabBarIcon: ({ color }) => (
                <MaterialCommunityIcons name="home" color={color} size={26} />
              ),
            }}
          />
          <Tab.Screen
            name="Faculty"
            component={FacultyStackScreen}
            options={{
              tabBarLabel: 'Updates',
              tabBarIcon: ({ color }) => (
                <MaterialCommunityIcons name="bell" color={color} size={26} />
              ),
            }}
          />
        
        </Tab.Navigator>
    )
    export default MainTabScreen;
    const HomeStackScreen =({navigation}) => (
        <HomeStack.Navigator
        screenOptions={{
            headerStyle: { backgroundColor: "tomato", elevation: 0 },
           headerTintColor: "#fff",
           headerTitleAlign: "center",
            headerShown:true,
            
          }}
        >
            <HomeStack.Screen name= "Home" component={HomeScreen}
            options={{
                title:'Overview',
                headerLeft: () => (
                    <Icon.Button name="ios-menu" size={26}
                    backgroundColor="tomato" onPress={() => navigation.openDrawer() }></Icon.Button>
                )
            }}
            />
        </HomeStack.Navigator>
    )
    
    const FacultyStackScreen =({navigation}) => (
        <FacultyStack.Navigator
        screenOptions={{
            headerStyle: { backgroundColor: "tomato", elevation: 0 },
           headerTintColor: "#fff",
           headerTitleAlign: "center",
            headerShown:true,
            
          }}
        >
            <FacultyStack.Screen name= "Faculty" component={FacultyScreen}
            options={{
                
                headerLeft: () => (
                    <Icon.Button name="ios-menu" size={26}
                    backgroundColor="tomato" onPress={() => navigation.openDrawer() }></Icon.Button>
                )
            }}
            />
        </FacultyStack.Navigator>
    )
    

    那么App.js如下:

    import React from 'react';
    import {NavigationContainer} from '@react-navigation/native';
    import {createDrawerNavigator} from '@react-navigation/drawer';
    import MainTabScreen from './app/screens/MaintabScreen';
    
    
    import { DrawerContent } from "./app/routes/drawer";
    
    
    const Drawer = createDrawerNavigator();
    export default function App() {
        return (
          <NavigationContainer initialRouteName= "Home">
             
           <Drawer.Navigator drawerContent={(props) => <DrawerContent {...props} />}>
               <Drawer.Screen name="Home" component={MainTabScreen}/>
               {/* <Drawer.Screen name="Faculty" component={FacultyStackScreen}/> */}
           </Drawer.Navigator>
          </NavigationContainer>
        );
      }
    

    抽屉助手和以前一样

    import React from "react";
    import { StyleSheet, View } from "react-native";
    import {
      DrawerContentScrollView,
      DrawerItem,
      DrawerItemList,
    } from "@react-navigation/drawer";
    
    import {
      Avatar,
      Title,
      Caption,
      Paragraph,
      Drawer,
      Text,
      TouchableRipple,
      Switch,
    } from "react-native-paper";
    import { MaterialCommunityIcons, FontAwesome5 } from "@expo/vector-icons";
    
    import Home from './homeStack'
    
    export function DrawerContent({ ...props }) {
      return (
        <View style={{ flex: 1 }}>
          <DrawerContentScrollView {...props}>
            {/* <DrawerItemList {...props}/> */}
            <DrawerItem
              icon={({ color, size }) => (
                <MaterialCommunityIcons name="home" color={color} size={size} />
              )}
              label="Home"
              onPress={() => props.navigation.navigate("Home")}
            />
            <DrawerItem
              icon={({ color, size }) => (
                <FontAwesome5 name="university" color={color} size={size} />
              )}
              label="Faculties"
              onPress={() => props.navigation.navigate("Faculty")}
            />
          </DrawerContentScrollView>
        </View>
      );
    }
    

    我发现这是一种管理嵌套导航的简单方法,如果有人有更好的改进建议,这几乎就是我想要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多