[React Native] Native Stack Navigator


πŸ”₯ 1. Native Stack Navigator

  • Native Stack NavigatorλŠ” 각 μƒˆ 화면이 μŠ€νƒμ˜ 맨 μœ„μ— λ°°μΉ˜λ˜μ–΄ ν™”λ©΄ κ°„ μ „ν™˜μ„ μ œκ³΅ν•˜λŠ” 방식을 제곡
  • iOSμ—μ„œλŠ” λ„€μ΄ν‹°λΈŒ API인 UINavigationControllerλ₯Ό μ‚¬μš©ν•˜κ³  Androidμ—μ„œλŠ” Fragmentλ₯Ό μ‚¬μš©ν•˜μ—¬ createNativeStackNavigator으둜 κ΅¬μΆ•λœ λ„€λΉ„κ²Œμ΄μ…˜μ΄ λ„€μ΄ν‹°λΈŒλ‘œ κ΅¬μΆ•λœ μ•±κ³Ό μ™„μ „νžˆ λ™μΌν•œ λ™μž‘κ³Ό μ„±λŠ₯ νŠΉμ„±μ„ 갖도둝함
yarn add @react-navigation/native-stack

πŸ”₯ 2. Props

  1. id: λ„€λΉ„κ²Œμ΄ν„°μ— λŒ€ν•œ 선택적인 고유 μ‹λ³„μžμž…λ‹ˆλ‹€. 이λ₯Ό μ΄μš©ν•˜μ—¬ navigation.getParentλ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ‹ λ„€λΉ„κ²Œμ΄ν„°μ—μ„œ 이 λ„€λΉ„κ²Œμ΄ν„°λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. initialRouteName: λ„€λΉ„κ²Œμ΄ν„°κ°€ 처음 λ‘œλ“œλ  λ•Œ λ Œλ”λ§ν•  라우트의 μ΄λ¦„μž…λ‹ˆλ‹€. 이 이름은 λ„€λΉ„κ²Œμ΄ν„°κ°€ μ‹œμž‘λ  λ•Œ ν‘œμ‹œν•  초기 화면을 κ²°μ •ν•©λ‹ˆλ‹€.
  3. screenOptions: λ„€λΉ„κ²Œμ΄ν„° λ‚΄μ˜ 화면에 λŒ€ν•œ κΈ°λ³Έ μ˜΅μ…˜μž…λ‹ˆλ‹€. 이 μ˜΅μ…˜μ€ λ„€λΉ„κ²Œμ΄ν„° λ‚΄ λͺ¨λ“  화면에 μ μš©λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λͺ¨λ“  화면에 λ™μΌν•œ 섀정을 μ μš©ν•˜κ±°λ‚˜ 일뢀 ν™”λ©΄μ—λ§Œ μ μš©ν•  νŠΉμ • 섀정을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”₯ 3. Options

  1. title: λ„€λΉ„κ²Œμ΄μ…˜ ν—€λ”μ˜ κΈ°λ³Έ 제λͺ©μœΌλ‘œ μ‚¬μš©λ  λ¬Έμžμ—΄μž…λ‹ˆλ‹€.
  2. headerBackButtonMenuEnabled: iOS 버전이 14 이상일 λ•Œ λ°± λ²„νŠΌμ„ λ‘±ν”„λ ˆμŠ€ν•˜λ©΄ 메뉴λ₯Ό 보여쀄지 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€. 기본값은 trueμž…λ‹ˆλ‹€.
  3. headerBackVisible: 헀더에 λ°± λ²„νŠΌμ΄ ν‘œμ‹œλ˜λŠ”μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€. headerLeft와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ λ°± λ²„νŠΌμ„ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  4. headerBackTitle: iOSμ—μ„œ λ°± λ²„νŠΌμ— μ‚¬μš©ν•  타이틀 λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 이전 ν™”λ©΄μ˜ 제λͺ©μ΄ 기본값이며 곡간이 λΆ€μ‘±ν•œ 경우 β€œBackβ€μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.
  5. headerBackTitleVisible: λ°± λ²„νŠΌ 타이틀이 ν‘œμ‹œλ˜λŠ”μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.
  6. headerBackTitleStyle: 헀더 λ°± νƒ€μ΄ν‹€μ˜ μŠ€νƒ€μΌ κ°μ²΄μž…λ‹ˆλ‹€. fontFamily, fontSize λ“±μ˜ 속성을 μ§€μ›ν•©λ‹ˆλ‹€.
  7. headerBackImageSource: ν—€λ”μ—μ„œ λ°± λ²„νŠΌμ— ν‘œμ‹œν•  μ΄λ―Έμ§€μž…λ‹ˆλ‹€. ν”Œλž«νΌμ— 따라 κΈ°λ³Έκ°’μœΌλ‘œ iOSμ—λŠ” chevron, Androidμ—λŠ” ν™”μ‚΄ν‘œκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.
  8. headerLargeStyle: 큰 타이틀이 ν‘œμ‹œλ  λ•Œ ν—€λ”μ˜ μŠ€νƒ€μΌμž…λ‹ˆλ‹€. headerLargeTitle이 true이고 슀크둀 κ°€λŠ₯ν•œ λ‚΄μš©μ΄ 헀더와 μΌμΉ˜ν•˜λŠ” κ°€μž₯μžλ¦¬μ— 도달할 λ•Œ 큰 타이틀이 ν‘œμ‹œλ©λ‹ˆλ‹€.
  9. headerLargeTitle: 슀크둀 μ‹œ 일반적인 ν—€λ”λ‘œ μΆ•μ†Œλ˜λŠ” 큰 제λͺ©μ΄ μžˆλŠ” 헀더λ₯Ό ν™œμ„±ν™”ν• μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€. ScrollView λ˜λŠ” FlatList와 같은 슀크둀 κ°€λŠ₯ν•œ 뷰둜 ν™”λ©΄ λ‚΄μš©μ„ 감싸야 ν•©λ‹ˆλ‹€.
  10. headerLargeTitleShadowVisible: 큰 제λͺ©μ΄ ν‘œμ‹œλ  λ•Œ ν—€λ”μ˜ λ“œλ‘­ μ‰λ„μš°κ°€ λ³΄μ΄λŠ”μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.
  11. headerShown: 헀더λ₯Ό ν‘œμ‹œν• μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€. 기본적으둜 헀더가 ν‘œμ‹œλ©λ‹ˆλ‹€. false둜 μ„€μ •ν•˜λ©΄ 헀더λ₯Ό μˆ¨κΉλ‹ˆλ‹€.
  12. headerStyle: ν—€λ”μ˜ μŠ€νƒ€μΌ κ°μ²΄μž…λ‹ˆλ‹€. backgroundColor, headerShadowVisible λ“±μ˜ 속성을 μ§€μ›ν•©λ‹ˆλ‹€.
  13. headerTransparent: λ„€λΉ„κ²Œμ΄μ…˜ λ°”κ°€ 투λͺ…ν•œμ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€. true둜 μ„€μ •ν•˜λ©΄ 헀더가 μ ˆλŒ€μ μœΌλ‘œ μœ„μΉ˜ν•˜μ—¬ λ‚΄μš© μ•„λž˜λ‘œ 겹쳐지도둝 λ§Œλ“­λ‹ˆλ‹€.
  14. headerBlurEffect: 투λͺ…ν•œ ν—€λ”μ˜ λΈ”λŸ¬ νš¨κ³Όμž…λ‹ˆλ‹€. headerTransparent μ˜΅μ…˜μ΄ true둜 μ„€μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  15. headerBackground: ν—€λ”μ˜ 배경으둜 μ‚¬μš©ν•  React Elementλ₯Ό λ Œλ”λ§ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. μ΄λ―Έμ§€λ‚˜ κ·ΈλΌλ””μ–ΈνŠΈμ™€ 같은 배경을 μ‚¬μš©ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.
  16. headerTintColor: ν—€λ”μ˜ ν‹΄νŠΈ μƒ‰μƒμž…λ‹ˆλ‹€. λ°± λ²„νŠΌκ³Ό 제λͺ©μ˜ 색상을 λ³€κ²½ν•©λ‹ˆλ‹€.
  17. headerLeft: 헀더 μ™Όμͺ½μ— ν‘œμ‹œν•  μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. λ°± λ²„νŠΌμ„ λŒ€μ²΄ν•©λ‹ˆλ‹€.
  18. headerRight: 헀더 였λ₯Έμͺ½μ— ν‘œμ‹œν•  μš”μ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
  19. headerTitle: ν—€λ”μ—μ„œ μ‚¬μš©ν•  λ¬Έμžμ—΄ λ˜λŠ” React Elementλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 기본값은 ν™”λ©΄μ˜ 제λͺ© λ˜λŠ” μ΄λ¦„μž…λ‹ˆλ‹€.
  20. headerTitleAlign: 헀더 제λͺ©μ„ μ–΄λ–»κ²Œ 정렬할지 λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€. left, center λ“±μ˜ 값이 κ°€λŠ₯ν•˜μ§€λ§Œ iOSμ—μ„œλŠ” 항상 center둜 κ³ μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  21. headerTitleStyle: 헀더 제λͺ©μ˜ μŠ€νƒ€μΌ κ°μ²΄μž…λ‹ˆλ‹€. fontFamily, fontSize λ“±μ˜ 속성을 μ§€μ›ν•©λ‹ˆλ‹€.
  22. headerSearchBarOptions: iOSμ—μ„œ λ„€μ΄ν‹°λΈŒ 검색 λ°”λ₯Ό λ Œλ”λ§ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. autoCapitalize, autoFocus λ“±μ˜ 속성을 μ§€μ›ν•©λ‹ˆλ‹€.
  23. header: κΈ°λ³Έ 헀더 λŒ€μ‹ μ— μ‚¬μš©ν•  μ»€μŠ€ν…€ 헀더λ₯Ό μ§€μ •ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. navigation, route, options, back을 ν¬ν•¨ν•˜λŠ” 객체λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  24. statusBarAnimation: μƒνƒœ ν‘œμ‹œμ€„ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€. iOSμ—μ„œλŠ” fade 기본값이며 Androidμ—μ„œλŠ” noneμž…λ‹ˆλ‹€.
  25. statusBarHidden: 이 ν™”λ©΄μ—μ„œ μƒνƒœ ν‘œμ‹œμ€„μ„ μˆ¨κΈΈμ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.
  26. statusBarStyle: μƒνƒœ ν‘œμ‹œμ€„ 색상을 μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€. auto, inverted, dark, light λ“±μ˜ 값이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  27. statusBarColor: μƒνƒœ ν‘œμ‹œμ€„ 색상을 μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€. Androidμ—μ„œλ§Œ μ§€μ›λ©λ‹ˆλ‹€.
  28. statusBarTranslucent: μƒνƒœ ν‘œμ‹œμ€„μ˜ 투λͺ…도λ₯Ό μ„€μ •ν•˜λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€. Androidμ—μ„œλ§Œ μ§€μ›λ©λ‹ˆλ‹€.
  29. contentStyle: ν™”λ©΄ λ‚΄μš©μ˜ μŠ€νƒ€μΌ κ°μ²΄μž…λ‹ˆλ‹€.
  30. customAnimationOnGesture: 제슀처λ₯Ό μ‚¬μš©ν•˜μ—¬ 화면을 닫을 λ•Œ 제곡된 μ• λ‹ˆλ©”μ΄μ…˜μ„ μ‚¬μš©ν• μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.
  31. fullScreenGestureEnabled: 전체 ν™”λ©΄μ—μ„œ 제슀처λ₯Ό μ‚¬μš©ν•˜μ—¬ 화면을 닫을지 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.
  32. gestureEnabled: 이 ν™”λ©΄μ—μ„œ 제슀처λ₯Ό μ‚¬μš©ν•˜μ—¬ 닫을 수 μžˆλŠ”μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.
  33. animationTypeForReplace: 이 화면이 λ‹€λ₯Έ 화면을 λŒ€μ²΄ν•  λ•Œ μ‚¬μš©ν•  μ• λ‹ˆλ©”μ΄μ…˜ μœ ν˜•μž…λ‹ˆλ‹€.
  34. animation: 화면을 ν‘Έμ‹œν•˜κ±°λ‚˜ νŒν•  λ•Œ 화면을 μ–΄λ–»κ²Œ μ• λ‹ˆλ©”μ΄μ…˜ν™”ν• μ§€ λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€.
  35. presentation: 화면이 ν‘œμ‹œλ  방법을 λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€.
  36. orientation: ν™”λ©΄μ˜ λ””μŠ€ν”Œλ ˆμ΄ λ°©ν–₯을 μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.
  37. autoHideHomeIndicator: ν™ˆ 인디케이터가 μˆ¨κ²¨μ Έμ•Ό ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.
  38. gestureDirection: 화면을 λ‹«κΈ° μœ„ν•΄ μŠ€μ™€μ΄ν”„ν•  λ°©ν–₯을 μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.
  39. animationDuration: iOSμ—μ„œ slide_from_bottom, fade_from_bottom, fade 및 simple_push μ „ν™˜μ˜ 지속 μ‹œκ°„μ„ λ³€κ²½ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.
  40. navigationBarColor: λ„€λΉ„κ²Œμ΄μ…˜ λ°” 색상을 μ„€μ •ν•˜λŠ” κ°’μž…λ‹ˆλ‹€.
  41. navigationBarHidden: λ„€λΉ„κ²Œμ΄μ…˜ λ°”λ₯Ό μˆ¨κΈΈμ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.
  42. freezeOnBlur: λΉ„ν™œμ„±ν™”λœ 화면이 λ¦¬λ Œλ”λ§λ˜μ§€ μ•Šλ„λ‘ 방지할지 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.

πŸ”₯ 4. Events

  1. transitionStart: 이 μ΄λ²€νŠΈλŠ” ν˜„μž¬ ν™”λ©΄μ˜ μ „ν™˜ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ λ°œμƒν•©λ‹ˆλ‹€.

    • 이벀트 데이터:
      • e.data.closing: 화면이 μ—΄λ¦¬λŠ”μ§€ λ‹«νžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.

    μ˜ˆμ‹œ:

    javascriptCopy code
    React.useEffect(() => {
      const unsubscribe = navigation.addListener('transitionStart', (e) => {
        // μ—¬κΈ°μ„œ 무언가λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€
      });
    
      return unsubscribe;
    }, [navigation]);
    
    
  2. transitionEnd: 이 μ΄λ²€νŠΈλŠ” ν˜„μž¬ ν™”λ©΄μ˜ μ „ν™˜ μ• λ‹ˆλ©”μ΄μ…˜μ΄ μ’…λ£Œλ  λ•Œ λ°œμƒν•©λ‹ˆλ‹€.

    • 이벀트 데이터:
      • e.data.closing: 화면이 μ—΄λ¦¬κ±°λ‚˜ λ‹«ν˜”λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆ€μšΈ κ°’μž…λ‹ˆλ‹€.

    μ˜ˆμ‹œ:

    javascriptCopy code
    React.useEffect(() => {
      const unsubscribe = navigation.addListener('transitionEnd', (e) => {
        // μ—¬κΈ°μ„œ 무언가λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€
      });
    
      return unsubscribe;
    }, [navigation]);