React Native и вложенная навигация, хороший способ?

#react-native #mobile #react-native-navigation

#react-native #Мобильный #реагирующая встроенная навигация

Вопрос:

Через несколько дней я спрашиваю здесь, потому что не нашел подходящего решения в Интернете.

Мой App.js render() возвращает навигатор ящика, как вы видите :

 render() {
        return (
            <NavigationContainer>
                <Drawer.Navigator
                    drawerContent={(props) => <this.customDrawerContent {...props} />}
                    initialRouteName="Past Launches"
                >
                    <Drawer.Screen name="Home" component={HomeScreen} options={drawerOptions}/>
                    <Drawer.Screen name="Next Launch" component={NextLaunch} options={drawerOptions}/>
                    <Drawer.Screen name="Past Launches" component={this.pastLaunches} options={drawerOptions}/>
                </Drawer.Navigator>
            </NavigationContainer>
        );
}
  

И здесь вы можете увидеть мой навигатор стека, возвращаемый функцией pastLaunches :

 pastLaunches() {
   return (
     <Stack.Navigator>
        <Stack.Screen name="launches" component={Launches} options={{ headerShown: false }}/>
        <Stack.Screen name="details" component={PastLaunchDetails} options={drawerOptions}/>
     </Stack.Navigator>
  );
}
  

Вот результат :

введите описание изображения здесь

Но когда я открываю прошлые сведения о запуске :

введите описание изображения здесь

Мы можем видеть заголовок ящика и заголовок стека.

Мой вопрос: как скрыть заголовок ящика, когда я нахожусь в этом представлении?

Большое спасибо!

Ответ №1:

Наконец, используйте headerShown: false

 const drawerOptions = { headerStyle: { backgroundColor: "#181C1F"}, headerTintColor: "white" };



export default class App extends React.Component {
    pastLaunches() {
        return (
          <Stack.Navigator headerMode='none'>
            <Stack.Screen name="launches" component={Launches} />
            <Stack.Screen name="details" component={PastLaunchDetails} options={drawerOptions}
            />
          </Stack.Navigator>
        );
    }

    customDrawerContent(props) {
        return (
            <ImageBackground style={{flex: 1, justifyContent: "center"}}>
                <DrawerContentScrollView {...props} style={{ backgroundColor: 'rgba(0, 0, 0, 0.6)', flex: 1}} >
                    <DrawerItemList {...props} labelStyle={{ color: "white" }} activeTintColor="black" itemStyle={{ flex: 1 }}/>
                </DrawerContentScrollView>
            </ImageBackground>
        );
    }

    render() {
        return (
            <NavigationContainer>
                <Drawer.Navigator
                    drawerContent={(props) => <this.customDrawerContent {...props} />}
                    initialRouteName="Past Launches"
                    headerMode='none'
                >
                    <Drawer.Screen name="Home" component={HomeScreen} options={{...drawerOptions, headerShown: false}}/>
                    <Drawer.Screen name="Next Launch" component={NextLaunch} options={{...drawerOptions, headerShown: false}}/>
                    <Drawer.Screen name="Past Launches" component={this.pastLaunches} options={{...drawerOptions, headerShown: false}}/>
                </Drawer.Navigator>
            </NavigationContainer>
        );
    }
}
  

Пользовательский заголовок ящика

 import { DrawerActions } from '@react-navigation/native'

export const CustomDrawerHeader = (props) => {
      const navigation = useNavigation();
      return (<View style={{ flexDirection: 'row', paddingVertical: 12, paddingHorizontal: 12}}>
         <Button onPress={() => {
           navigation.dispatch(DrawerActions.toggleDrawer());
         }}
         title='Menu icon'></Button>
         <Text style={{textAlign: 'center'}}>{props.title}</Text>
      </View>)
}
  

Пользовательский заголовок back

 
export const CustomStackHeader = (props) => {
      const navigation = useNavigation();
      return (<View style={{ flexDirection: 'row', paddingVertical: 12, paddingHorizontal: 12}}>
         <Button onPress={() => {
           navigation.goBack();
         }}
         title='Back icon'></Button>
         <Text style={{textAlign: 'center'}}>{props.title}</Text>
      </View>)
}
  

Также я не рекомендую сохранять ваш StackNavigator в методе внутри вашего компонента ящика, перемещая его наружу (вы получите повторный рендеринг и потеряете производительность).

Комментарии:

1. Я пытался, но ваша идея скрывает «прошлые запуски» из навигации по ящикам, а не в заголовке, когда я нахожусь в деталях прошлых запусков. Я понимаю ваши вторые комментарии, мой навигатор стека должен быть в компоненте прошлых запусков?

2. разветвите эту закуску и повторите вашу проблему и укажите, где вы размещали прошлые запуски, и я смогу помочь вам лучше. разветвите эту закуску snack.expo.io/@anthowm/41a9b3

3. Вы можете увидеть код в действии здесь: snack.expo.io/@yannickslc/react-nav

4. Я обновляю ответ извините, не могу войти в expo, чтобы поделиться новым

5. Я видел ваш ответ, но вы скрываете ящик заголовка, теперь вы не можете перемещаться между разными представлениями. Кроме того, как пользователь может узнать, чтобы изменить страницу? Еще раз спасибо!