Stack
, BottomTab
, Drawer
등 앱 개발시 많이 사용하는 화면 이동에 대해 각 플랫폼 환경에 맞도록 쉽게 변환Navigator + Screen
Navigator
: Navigation이 어떤 구조로 되어있는지 나타내는 컴포넌트 ( Screen 의 집합 ) Screen
: 화면을 그리는 컴포넌트 Navigator
Stack Navigator의 두 가지종류
Stack Navigator
: JS로 작성, 자유도 높음Native Stack Navigator
: Native로 작성 자유도 낮음
Stack Navigator 외에도 유저들이 가장 잘 볼 수 있는 위치에 놓고, 접근성을 높이기 위해 사용하는 Drawer Navigator
, Tab Navigator
가 있습니다.
open
, close
, toggle
등 기본적인 기능들을 함수로 제공UI
도 제공어떠한 화면 혹은 컴포넌트가 생성되고 없어지는 순서입니다.
A Screen
과, B Screen
이 있는 StackNavigator가 있다고 가정하고, A Screen
에서, B Screen
으로 넘어가는 과정입니다.
최초의 화면 진입시 A Screen
의 constructor, render, componentDidMount 가 순서대로 호출되며 A Screen
이 화면에 보여집니다.
->
A Screen
constructor
->A Screen
render
->A Screen
componentDidMount
B Screen
으로 이동시 B Screen
의 constructor, render, componentDidMount 가 순서대로 호출됩니다.
->
A Screen
constructor
->A Screen
render
->A Screen
componentDidMount
->B Screen
constructor
->B Screen
render
->B Screen
componentDidMount
A Screen
은 아직 사라지지 않고 BackGround에 남아있기 때문에 A Screen
의 componentWillUnmount는 호출되지 않은 모습입니다.
B Screen
에서 빠져나오면 B Screen
의 componentWillUnmount가 호출됩니다.
->
A Screen
constructor
->A Screen
render
->A Screen
componentDidMount
->B Screen
constructor
->B Screen
render
->B Screen
componentDidMount
->B Screen
componentWillUnmount
B Screen
이 componentWillUnmount 되고, 다시 A Screen
이 보이는 모습입니다.
A Screen
은 componentWillUnmount되지 않았기 때문에 새로 호출되는 것이 아니기 때문에 constructor, render, componentDidMount 의 재 호출 없이 A screen
이 보여집니다.
마찬가지로 A Tab
과, B Tab
을 가지고있는 TabNavigator가 있다고 가정하고, A Tab
에서, B Tab
으로 넘어가는 과정을 살펴보겠습니다.
최초의 화면 진입시 A Tab
의 constructor, render, componentDidMount 가 순서대로 호출되며 A Tab
이 보여집니다.
->
A Tab
constructor
->A Tab
render
->A Tab
componentDidMount
B Tab
으로 넘어가게되면 B Tab
의 constructor, render, componentDidMount 가 순서대로 호출되며 B Tab
이 보여집니다.
->
A Tab
constructor
->A Tab
render
->A Tab
componentDidMount
->B Tab
constructor
->B Tab
render
->B Tab
componentDidMount
StackNavigator과 마찬가지로 A Tab
의 componentWillUnmount는 호출되지 않습니다.
Tab Navigator는 Tab
으로의 이동이 손쉬운 편이고, 탭간 이동시 새로운 데이터를 불러오는 등의 요구사항이 있을 수 있습니다.
아래의 네비게이터 이벤트로 해당 요구사항을 처리할 수 있습니다.
const unsubscribe = navigation.addListener('tabPress', (e) => ()}
const unsubscribe = navigation.addListener('focus', (e) => ()}
navigation.addListener 함수를 통해서 tab
간 이동 시, 해당 화면이 보이는 순간을 감지할 수 있습니다.
Navigation Container
: 전체 Navigator를 관리해주는 역할Navigation
의 상태나 동작을 제어해주는 함수의 집합Screen
이 있는제 찾기 위해 사용어떤 화면이 backGround에 있는지 확인할 수 있겠네요!
-Screen
의 Name, Key, Param 등을 저장하는 개념
Stack Navigator 에서 화면 이동 애니메이션에 대한 설정 옵션입니다.
Card
: 오른쪽에서 왼쪽으로 이동하는 애니메이션Modal
: 아래에서 위로 이동하는 애니메이션기본값은 Card
로 되어있습니다.
Android 에서 H/W Back Button을 눌렀을 때 어떻게 이동하는지 지정해줍니다.
firstRoute
: 선언상 제일 처음에 있는 탭으로 이동initialRoute
: 최초 지정한 탭으로 이동order
: 탭을 선언한 순으로 이동history
: 이동한 히스토리 역순으로 이동 실무에서는 보통 firstRoute
와 initialRoute
를 사용하고있고, 처음탭에서 한 번 더 누를 경우 종료하시겠습니까?
를 물어본다고합니다. 익숙한 패턴이네요..
Screen
을 Component가 아닌 다른 Navigator 로 선언주의해야할 점
- Navigator 는 각자의
History
를 가지고 있음.- Navigator 에서
Screen Param
은 전달되지 않음- B Navigator 에서 동작할 수 없으면 A Navigator로 전달
- A Navigator의 이벤트를 B Navigator에서 받아볼 수 없음
>>>> const unsubscribe = navigation.getParent().addListener('tabPress', (e) => {}) >>>> const unsubscribe = navigation.getParent().addListener('focus', (e) => {})
focus
,blur
등 필요한 경우getParent
로 찾아서 등록 가능
Tab
,Drawer
의 하위 Navigator일 경우Tab
또는Drawer
에 가려짐
scheme
을 가지고 있음무단으로 Scheme을 빼앗아 가는 현상을 막기 위해 각 플랫폼에서의 도메인 인증단계를 통과해야한다.
IOS
- Universal Link
Android
- App Links
화면 이동에 대한 명령어를 담고있는 Ocject
Action 구조
type
: 어떤 작업인지 나타내는 식별자payload
: 추가 정보가 포함되어있음. (parameter)
공통적으로 사용되는 CommonAction
navigate
: 특정 화면으로 이동하는 actionreset
: 현재 상태를 지정한 상태로 변경해주는 actiongoBack
: 이전 히스토리로 이동해주는 action
StackAction
push
: 새로운 화면을 최상단에 넣는 것pop
: 현재 보이고 있는 화면을 꺼내는 것
StackAction push와 CommonAction navigate의 차이점
push A
,push B
,push A
의 Action이 발생한 모습을 살펴보겠습니다.
StackAction push 의 경우를 먼저 살펴보겠습니다.
push
는 제일 마지막 화면으로 계속 넣는 Action 입니다.
push A
-> push B
-> push A
동작을 하였을 때
A Screen 위에 B Screen 이 그려지고 그 위에 A Screen이 그려집니다.
CommonAction navigate 역시 살펴보겠습니다.
navigator
는 이전 Stack에 동일한 Screen을 가지고 있다면 pop
Action도 수행합니다.
navigator A
-> navigator B
> navigator A
동작을 하였을 때
A Screen 위에 B Screen 이 그려지고, B Screen을 pop
하여 A Screen을 보여줍니다.
TabAction
jumpTo
: Tab간 이동해야할 때 사용
이번 게시글에서 React Navigation 개념을 익혀보았습니다.
다음 게시글에서는 실제 코드를 작성하여 동작해보도록 하겠습니다.