2019-06-21
예전 4주 프로젝트 하면서 읽었던 거지만, 오늘 다시 읽어보았다.
리액트 네비게이션은 앱환경, 즉 RN에서도 브라우저처럼 global history를 제공하고, navigate할 수 있도록 하기 위해 만들어졌다.
앱이 스택 네비 하나만 사용한다면 웹브라우저와 비슷한 상태가 된다. 그러나 핵심적인 차이가 있는데, 브라우저와는 달리 제스쳐와 애니메이션을 제공한다. (네이티브 앱처럼)
createStackNavigator()는 리액트 컴포넌트를 리턴한다.
(따라서, 바로 export해서 App의 루트 컴포넌트에 사용하도록 할수있다)
route configuration object를 인자로 받고, options object도 받을 수 있다.Screens 컴포넌트에 navigation props가 내려진다.
(아마도 AppContainer 혹은 StackNavigator에서 내려줄거같다)
각 스크린에서는 this.props.navigation으로 접근가능하고, navigate() 메서드로 화면이동을 한다.
withNavigation() 이라는 Higher Order Component가 필요하다. (export할 때 한번 감싸주면 자동으로 props.navigation내려준다)navigate()와 push()의 차이는, navigate는 이미 목적 스크린에 있는 경우 아무일도 하지 않는다.
반면 push는 이미 그 스크린에 있어도 navigation stack에 push한다.
goBack() 메서드는 뒤로가기 버튼 기능임. Stack Navigator의 경우 header의 왼쪽에 back버튼이 자동으로 들어가도록 디폴트가 잡혀있다. (안드로이드에서는 하드웨어 백버튼 누르면 goBack을 실행하게 해놨음. )
AppContainer 는 앱 state를 관리하고, top-level navigator를 app 환경과 연결한다. 안드로이드에서는, app container는 백버튼을 핸들링하기 위해 Linking API를 사용한다. 이 컨테이너는 navigation state를 지속시키도록(persist) 설정될 수 있다. 웹에서는, RN과는 다른 컨테이너를 사용해야한다(createBrowserApp) — 이건 아마 RN을 웹 환경 target으로 빌드하는 경우를 말하는 것 같다.
onNavigationStateChange()메서드를 이용해, navigation state가 변할 떄 마다 액션을 취할 수 있다.
SwitchNavigator의 목적은, 한번에 하나의 화면만 보여주는 것이다. 기본적으로, 뒤로가기 액션을 핸들링하지 않으며, 화면을 떠날 때 route를 default state로 리셋한다.
이것은 정확히 인증 플로우에 우리가 기대하는 행동이다.
(유저가 로그인하면, 인증 플로우의 state를 날려버리고, 스크린을 unmount하게 되길 기대한다. 그리고 하드웨어 백 버튼을 눌렀을 때 다시 그 인증 플로우 화면에 접근할 수 없기를 기대하기 때문이다.)** setParams() / getParam() 은 현 스크린에 이미 있는 param을 수정(새 key는 merge)하거나 가져오는데 사용한다.
(다른 스크린으로부터 받아오거나 넘겨주는 메서드가 아님)