ซ่อนส่วนหัวใน stack navigator React navigation


140

ฉันกำลังพยายามเปลี่ยนหน้าจอโดยใช้ทั้งสแต็กและแถบนำทาง

const MainNavigation = StackNavigator({
      otp: { screen: OTPlogin },
      otpverify: { screen: OTPverification},
      userVerified: {
        screen: TabNavigator({
          List: { screen: List },
          Settings: { screen: Settings }
        }),
      },
    });

ในกรณีนี้จะใช้ stacknavigator ก่อนแล้วจึงใช้ tabnavigator และฉันต้องการซ่อนส่วนหัวของสแต็กเนวิเกเตอร์ มันทำงานไม่ถูกต้องเมื่อฉันใช้การนำทางตัวเลือกเช่น ::

navigationOptions: { header: { visible: false } }

ฉันกำลังลองใช้รหัสนี้กับสององค์ประกอบแรกที่ใช้ใน stacknavigator ถ้าฉันใช้บรรทัดนี้แล้วได้รับข้อผิดพลาดเช่น ::

ใส่คำอธิบายภาพที่นี่

คำตอบ:


337

อัปเดตเป็นเวอร์ชัน 5

ในเวอร์ชัน 5 เป็นตัวเลือกheaderShownในscreenOptions

ตัวอย่างการใช้งาน:

<Stack.Navigator
  screenOptions={{
    headerShown: false
  }}
>
  <Stack.Screen name="route-name" component={ScreenComponent} />
</Stack.Navigator>

หากคุณต้องการเพียงซ่อนส่วนหัวใน 1 หน้าจอคุณสามารถทำได้โดยการตั้งค่าหน้าจอตัวเลือกบนส่วนประกอบหน้าจอดูตัวอย่างด้านล่าง:

<Stack.Screen options={{headerShown: false}} name="route-name" component={ScreenComponent} />

ดูบล็อกเกี่ยวกับเวอร์ชัน 5

อัปเดต
ในเวอร์ชัน 2.0.0-alpha.36 (2019-11-07)
มี navigationOption ใหม่:headershown

      navigationOptions: {
        headerShown: false,
      }

https://reactnavigation.org/docs/stack-navigator#headershown

https://github.com/react-navigation/react-navigation/commit/ba6b6ae025de2d586229fa8b09b9dd5732af94bd

คำตอบเก่า

ฉันใช้สิ่งนี้เพื่อซ่อนแถบสแต็ก (สังเกตว่านี่คือค่าของพารามิเตอร์ตัวที่สอง):

{
    headerMode: 'none',
    navigationOptions: {
        headerVisible: false,
    }
}

เมื่อคุณใช้วิธีนี้ระบบจะซ่อนไว้ในทุกหน้าจอ

ในกรณีของคุณจะมีลักษณะดังนี้:

const MainNavigation = StackNavigator({
  otp: { screen: OTPlogin },
  otpverify: { screen: OTPverification },
  userVerified: {
    screen: TabNavigator({
    List: { screen: List },
    Settings: { screen: Settings }
   }),
 }
},
{
  headerMode: 'none',
  navigationOptions: {
    headerVisible: false,
  }
 }
);

ทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณสำหรับคำตอบของคุณ แต่ฉันมีปัญหาอย่างหนึ่งหลังจากเพิ่มสิ่งนี้นั่นคือ :: การสลับ stacknavigator เป็น tabnavigator มันทำงานได้ดี ถ้าฉันต้องการแสดงส่วนหัวเมื่อฉันเปลี่ยนหน้าจอจาก tabnavigator เป็น stacknaviagtor ฉันควรทำอย่างไร?
Avijit Dutta

2
อืมเป็นคำถามที่ดี พูดตามตรงฉันไม่รู้เรื่องนั้น คุณสามารถลองใช้คำตอบ @Dpkstr บนหน้าจอที่คุณต้องการแสดงแทนค่าว่างมันจะเป็นจริง
Perry

อืมฉันลองแล้ว แต่ก็ไม่ได้ผล ... ขอบคุณสำหรับคำตอบแรกของคุณ ฉันจะสร้างฟังก์ชันที่สองโดยใช้ปุ่มในตอนนี้
Avijit Dutta

วิธีแสดงและซ่อนส่วนหัวแบบไดนามิกเมื่อคลิกที่ปุ่มภายในส่วนประกอบ ถ้าเราให้ static navigationOptions = {header: null} ฉันจะซ่อนส่วนหัวอย่างสมบูรณ์ ฉันต้องการแสดงหรือซ่อนเมื่อคลิกที่ปุ่มบางปุ่ม
Venkatesh Somu

1
หากเขาต้องการซ่อนส่วนหัวสำหรับหน้าจอเฉพาะใน v5 + ควรใช้optionsเสาแบบนี้<Stack.Screen options={{ headerShown: false, }} name="Artist" component={Artist} />
Oliver D

130

เพียงใช้โค้ดด้านล่างในหน้าที่คุณต้องการซ่อนส่วนหัว

export default class Login extends Component {
    static navigationOptions = {
        header: null
    }
}

อ้างถึงStack Navigator


เป็นเรื่องปกติ แต่ปัญหาอย่างหนึ่งคือเมื่อเปลี่ยนหน้าจอเป็น tabNavigator จาก stacknavigator (ตามที่กล่าวถึงในส่วนประกอบคำถามของฉันเช่นหน้าจอ OTPverification ไปยังหน้าจอรายการในเวลานั้นส่วนหัวทั้งสองกำลังแสดง
Avijit Dutta

คุณบอกฉันได้ไหมว่าคุณไปที่ List ได้อย่างไร
Dpkstr

22

เพียงเพิ่มสิ่งนี้ลงในข้อมูลโค้ดชั้นเรียน / ส่วนประกอบของคุณและส่วนหัวจะถูกซ่อน

 static navigationOptions = { header: null }

16

หากหน้าจอของคุณเป็นส่วนประกอบของคลาส

static navigationOptions = ({ navigation }) => {
    return {
       header: () => null
    } 
}

รหัสนี้ในหน้าจอเป้าหมายของคุณเป็นวิธีการแรก (ฟังก์ชัน)


1
ขวาheader: () => nullเป็นวิธีที่ถูกต้องมิฉะนั้นคุณจะได้รับความผิดพลาดส่วนหัวเมื่อโหลดหน้าเว็บ
Cristian Tr

11

หากคุณต้องการซ่อนบนหน้าจอที่เฉพาะเจาะจงกว่าทำเช่นนี้:

// create a component
export default class Login extends Component<{}> {
  static navigationOptions = { header: null };
}

11

ในโซลูชันที่กำหนด Header ถูกซ่อนไว้สำหรับ HomeScreen by- options = {{headerShown: false}}

<NavigationContainer>
  <Stack.Navigator>
    <Stack.Screen name="Home" component={HomeScreen} options={{headerShown:false}}/>
    <Stack.Screen name="Details" component={DetailsScreen}/>
  </Stack.Navigator>
</NavigationContainer>

10

ฉันใช้header : nullแทนheader : { visible : true }ฉันใช้ react-native cli นี่คือตัวอย่าง:

static navigationOptions = {
   header : null   
};

9

เพิ่มอ็อบเจ็กต์ navigationOptions ใหม่ใน stackNavigator

ลองสิ่งนี้:

const MainNavigator = createStackNavigator({
  LoginPage: {screen : LoginPageContainer, navigationOptions: { header: null } },
  MiddlePage: {screen : MiddlePageContainer, navigationOptions: { header: null } },
  SMS: {screen: ShowSmsContainer, navigationOptions: { header: null } },
  Map: {screen: ShowMapContainer, navigationOptions: { header: null } }
});

หวังว่าจะช่วยได้


7

หากมีคนค้นหาวิธีการสลับส่วนหัวใน componentDidMount ให้เขียนสิ่งที่ต้องการ:

  this.props.navigation.setParams({
      hideHeader: true,
  });

เมื่อไหร่

static navigationOptions = ({ navigation }) => {
    const {params = {}} = navigation.state;

    if (params.hideHeader) {
      return {
        header: null,
      }
    }

    return {
        headerLeft: <Text>Hi</Text>,
        headerRight: <Text>Hi</Text>,
        headerTitle: <Text>Hi</Text>
    };
};

และบางแห่งเมื่องานเสร็จสิ้น:

this.props.navigation.setParams({
  hideHeader: false,
});





2

หากคุณต้องการลบออกจากหน้าจอเดียวเท่านั้นreact-native-navigation:

<Stack.Navigator>
    <Stack.Screen 
            name="Login" 
            component={Login} 
            options= {{headerShown: false}} />
</Stack.Navigator>

1
const CallStack = createStackNavigator({
  Calls: Calls,
  CallsScreen:CallsScreen,
}, {headerMode: 'none'});

CallStack.navigationOptions = {
  tabBarLabel: 'Calls',
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? 'ios-options' : 'md-options'}
    />
  ),

   header: null,

        headerVisible: false,

};

1

คำตอบทั้งหมดแสดงวิธีดำเนินการกับส่วนประกอบของคลาส แต่สำหรับส่วนประกอบที่ใช้งานได้คุณทำ:

const MyComponent = () => {
    return (
        <SafeAreaView>
            <Text>MyComponent</Text>
        </SafeAreaView>
    )
}

MyComponent.navigationOptions = ({ /*navigation*/ }) => {
    return {
        header: null
    }
}

หากคุณนำส่วนหัวออกส่วนประกอบของคุณอาจอยู่ในที่ที่คุณมองไม่เห็น (เมื่อโทรศัพท์ไม่มีหน้าจอสี่เหลี่ยม) ดังนั้นการใช้ส่วนหัวจึงเป็นสิ่งสำคัญเมื่อนำส่วนหัวออก


1
const MyNavigator = createStackNavigator({
  FirstPage: {screen : FirstPageContainer, navigationOptions: { headerShown:false } },
  SecondPage: {screen : SecondPageContainer, navigationOptions: { headerShown: false } }
});

//header:null will be removed from upcoming versions

1
 <Stack.Screen
    name="SignInScreen"
    component={Screens.SignInScreen}
    options={{ headerShown: false }}
  />

options={{ headerShown: false }} เหมาะกับฉัน

** "@react-navigation/native": "^5.0.7", "@react-navigation/stack": "^5.0.8",


1

ในการตอบสนองนำทาง 5.xคุณสามารถซ่อนส่วนหัวสำหรับทุกหน้าจอโดยการตั้งheaderModeเสาของการNavigatorfalse

<Stack.Navigator headerMode={false}>
   {/* Your screens */}
</Stack.Navigator>

1

คุณสามารถซ่อนส่วนหัว StackNavigator ได้ดังนี้:

const Stack = createStackNavigator();
function StackScreen() {
    return (
        <Stack.Navigator
            screenOptions={{ headerShown: false }}>
            <Stack.Screen name="Login" component={Login} />
            <Stack.Screen name="Training" component={Training} />
            <Stack.Screen name="Course" component={Course} />
            <Stack.Screen name="Signup" component={Signup} />
        </Stack.Navigator>
    );
}

0

สิ่งสำคัญคือต้องจับคู่ไลบรารีการนำทางปฏิกิริยารุ่นใดที่คุณใช้กับโซลูชันเนื่องจากต่างกัน สำหรับผู้ที่ยังใช้ react-navigation v1.0.0 ด้วยเหตุผลบางอย่างเช่นฉันทั้งสองอย่างนี้ใช้ได้:

สำหรับการปิด / ซ่อนส่วนหัวในแต่ละหน้าจอ:

const AppScreens = StackNavigator(
  {
    Main: { screen: Main, navigationOptions: { header: null } },
    Login: { screen: Login },
    Profile: { screen: Profile, navigationOptions: { header: null } },
  });

สำหรับการปิด / ซ่อนหน้าจอทั้งหมดในครั้งเดียวให้ใช้สิ่งนี้:

const AppScreens = StackNavigator(
  {
    Main: { screen: Main},
    Login: { screen: Login },
    Profile: { screen: Profile },
  },
  {
    headerMode: 'none',
  }
);

0

ในเวอร์ชันล่าสุดของ react-navigation สิ่งนี้จะซ่อนส่วนหัวในทุกหน้าจอ: headerMode = {'none'}

<Stack.Navigator
headerMode={'none'}
>
    <Stack.Screen name="Home" component={HomeScreen}/>
    <Stack.Screen name="Details" component={DetailsScreen}/>
  </Stack.Navigator>


0

สำหรับ 4.x ซึ่งheader: nullเลิกใช้แล้วควรใช้headerShown: falseแทน

อดีต:

const AppScreens = createStackNavigator({
  cover: {
    screen: Login,
    path: '/login',
    navigationOptions: () => ({
      headerShown: false,
    }),
  },
})

0
  1. สำหรับหน้าจอเดียวคุณสามารถตั้งค่าheader: nullหรือheaderShown: falseใน createStackNavigator ได้เช่นนี้

    const App = createStackNavigator({
     First: {
    screen: Home,
    navigationOptions: {
      header: null,
                       },
           },
    });
  2. ซ่อนส่วนหัวจากหน้าจอทั้งหมดในครั้งเดียวโดยใช้ defaultNavigationOptions

    const App = createStackNavigator({
    
    First: {
      screen: HomeActivity,
    },
    },
    
    {
    defaultNavigationOptions: {
      header: null
    },
    
    });

0

หากคุณต้องการลบส่วนหัวออกจากหน้าจอ goto app.js ทั้งหมดและเพิ่มรหัสนี้ใน Stack.Navigator

screenOptions={ { headerShown: false } }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.