Жизненный цикл навигации¶
В предыдущем разделе мы работали со стековым навигатором, имеющим два экрана (Home и Details), и научились использовать navigation.navigate('RouteName') для перехода между маршрутами.
В связи с этим возникает важный вопрос: что происходит с экраном Home, когда мы уходим от него или когда возвращаемся к нему? Как маршрут узнает, что пользователь покидает его или возвращается к нему?
Если вы знакомитесь с react-навигацией на веб-основе, то можете предположить, что при переходе пользователя с маршрута A на маршрут B, маршрут A размонтируется (вызывается его componentWillUnmount) и A снова смонтируется, когда пользователь вернется к нему. Хотя эти методы жизненного цикла React по-прежнему актуальны и используются в react-navigation, их применение отличается от веб-приложений. Это обусловлено более сложными потребностями мобильной навигации.
Пример сценария¶
Рассмотрим стековый навигатор с экранами A и B. При переходе к A вызывается его componentDidMount. При переходе к экрану B также вызывается его componentDidMount, но A остается смонтированным в стеке, и его componentWillUnmount, соответственно, не вызывается.
При возврате из B в A вызывается componentWillUnmount для B, но componentDidMount для A не вызывается, поскольку A все это время оставался смонтированным.
Подобные результаты можно наблюдать (в сочетании) и с другими навигаторами. Рассмотрим навигатор табов с двумя вкладками, где каждая вкладка является навигатором стека:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
Начнем с экрана Домашний экран и перейдем к экрану Детали. Затем с помощью панели вкладок переходим на экран SettingsScreen и переходим на экран ProfileScreen. После выполнения этой последовательности операций все 4 экрана будут смонтированы! Если с помощью панели вкладок переключиться обратно на HomeStack, то можно заметить, что перед вами откроется DetailsScreen - состояние навигации по HomeStack сохранилось!
События жизненного цикла React Navigation¶
Теперь, когда мы поняли, как работают методы жизненного цикла React в React Navigation, давайте ответим на вопрос, который мы задали в самом начале: "Как мы узнаем, что пользователь покидает (размытие) или возвращается к нему (фокус)?"
React Navigation передает события экранным компонентам, которые на них подписаны. Мы можем прослушивать события focus и blur, чтобы узнать, когда экран попадает в фокус или уходит из фокуса соответственно.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Более подробно о доступных событиях и использовании API см. в разделе Navigation events.
Вместо того чтобы добавлять слушателей событий вручную, мы можем использовать хук useFocusEffect для выполнения побочных эффектов. Он похож на хук useEffect в React, но связан с жизненным циклом навигации.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Если вы хотите отображать различные объекты в зависимости от того, сфокусирован экран или нет, вы можете использовать хук useIsFocused, который возвращает булево число, указывающее, сфокусирован ли экран.
Резюме¶
- Хотя методы жизненного цикла React по-прежнему актуальны, React Navigation добавляет больше событий, на которые можно подписаться с помощью свойства
navigation. - Также можно использовать хуки
useFocusEffectилиuseIsFocused.