React Navigation 5.x第八章 导航器的生命周期

2023-10-28

在之前的章节中,我们学会了使用stack导航器,其有两个页面(Home和Details),并且知道如何使用navigation.navigate(‘RouteName’)在两个路由之间跳转。

在这篇文章中,我们主要了解当我们离开Home页面的时候都发生了什么,以及当我们返回到这个这个的时候其又发生了什么?路由是如何知道用户离开或者返回到这个页面的。

如果你之前从事过web相关工作,然后过来学习React Navigation,你就会发现当用户从路由A跳转到路由B的时候,A将会被卸载(componentWillUnmount方法会被调用)当用户从其他页面返回A页面的时候,A页面又会被重新加载。React 的生命周期方法在React Navigation中仍然有效,之所以用法与web不尽相同是因为移动端导航更为复杂。

案例场景

假设有一个stack导航器,其有A、B两个页面。当跳转到A页面的时候,它的componentDidMount将会被调用。当跳转到B页面的时候,B页面的compouentDidMount也会被调用,但是A页面依然在堆栈中保持被加载的状态,因此其componentWillUnmount方法也没有被调用。

当我们从B页面返回到A页面的时候,B页面的compouentWillUnmount将会被调用,但是A页面的componentDidMount不会被调用,因为其没有被卸载,在整个过程中一直保持被加载的状态。

在其他类型的导航器中也是同样的结果,假设有一个tab导航器,其有两个tabs,每个tab就是一个stack导航器。

function App() {
  return (
    <NavigationContainer>
      <Tab.Navigator>
        <Tab.Screen name="First">
          {() => (
            <SettingsStack.Navigator>
              <SettingsStack.Screen
                name="Settings"
                component={SettingsScreen}
              />
              <SettingsStack.Screen name="Profile" component={ProfileScreen} />
            </SettingsStack.Navigator>
          )}
        </Tab.Screen>
        <Tab.Screen name="Second">
          {() => (
            <HomeStack.Navigator>
              <HomeStack.Screen name="Home" component={HomeScreen} />
              <HomeStack.Screen name="Details" component={DetailsScreen} />
            </HomeStack.Navigator>
          )}
        </Tab.Screen>
      </Tab.Navigator>
    </NavigationContainer>
  );
}

现在我们从HomeScreen跳转到DetailsScreen页面,然后使用标签栏从SettingScreen 跳转到ProfileScreen。在这一系列操作做完后,所有的四个页面都已经被加载过了,如果你使用标签栏返回到HomeScreen,你会注意到你将到DetailsScreen页面----HomeStack的导航状态已经被保存

React Navigation生命周期事件

我们知道了在React Navigation中React 生命周期方法如何工作,现在就来回答一下最开始的问题:我们如何知道用户离开或者返回到当前页面呢?

React Navigation将事件发送到订阅他们的页面组件中,我们可以通过focus和blur方法监听用户离开返回事件。

function Profile({ navigation }) {
  React.useEffect(() => {
    const unsubscribe = navigation.addListener('focus', () => {
      // Screen was focused
      // Do something
    });

    return unsubscribe;
  }, [navigation]);

  return <ProfileContent />;
}

导航事件中可以找到更多的API用例和可用的事件

我们没必要手动添加监听器,我们可以使用useFocusEffect 挂钩来实现,它就像React的useEffect挂钩,但是它只能用户导航器的生命周期。

import { useFocusEffect } from '@react-navigation/native';

function Profile() {
  useFocusEffect(
    React.useCallback(() => {
      // Do something when the screen is focused

      return () => {
        // Do something when the screen is unfocused
        // Useful for cleanup functions
      };
    }, [])
  );

  return <ProfileContent />;
}

如果你想根据页面是否获得焦点和失去焦点来渲染不同的东西,你可以调用useIsFocused 挂钩,这个会返回一个布尔值,用来指示该页面是否获得了焦点。

总结

  • React 的生命周期方法仍然可用,除此之外React Navigation又增加了更多的事件,你可以通过navigation属性来订阅他们。
  • 你也可以使用useFocusEffect或者useIsFocused倒钩。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Navigation 5.x第八章 导航器的生命周期 的相关文章

  • 后台管理系统开发流程

    首先我们是从0开始开发的 那么就要从脚手架开始 这个后台管理系统的项目使用的是Vue脚手架3 0 安装好脚手架之后 我们就可以对项目进行封装模块 配置多环境变量 方便后期维护和修改 下载Vuex node sass axios elemen
  • 清理windows10自带的xbox等应用的脚本

    最近在系统封装中发现即使在母盘中删除了windows10自带的xbox等应用 再次重装之后仍然还是会有 通过Dism 对镜像分析未发现有相关的可删减的模块 遂采用PowerShell脚本去解决 Set ExecutionPolicy rem
  • CocosCreator环境搭建生成android应用apk cocos2d android NDK win10系统

    有问题找我 100 次 苹果mac系统下cocos2d android和ios含NDK开发环境搭建 安装说明20161129 点这里 一 工具 不能用中文路径或放在中文路径下 操作系统 win10专业版 1 android NDK andr
  • MySQL中SQL语句——DQL(数据查询语句)

    前言 首先对于数据库有一定的了解 会对于Mysql的学习有一定的帮助 数据库主要分为 DB 数据库 DBMS 数据库管理系统 SQL 结构化查询语言 用于和DBMS通信的语言 这篇要讲的DQL 数据查询语句 是属于SQL语言中的一种语言 因
  • 宋浩概率论与数理统计-第二章-笔记

    概率论与数理统计 第二章 2 1 随机变量的概念 2 2 1 离散型随机变量及其概率分布 连续型随机变量及其概率密度函数 2 2 2 分布函数的定义 离散型的分布函数 例题 连续型的分布函数 例题 2 2 3 常见的分布 离散型常见分布 0
  • React滚动条优化-滚动条滚动到最底部

    当消息较多出现滚动条时 有后续新消息的话总将滚动条滚动到最底部 声明一个 ref 并设置到聊天列表的容器元素上 用于操作聊天列表元素的引用 const chatListRef useRef null div 通过 useEffect 监听聊
  • C# Image和字节流的互化

    using System using System Collections Generic using System Linq using System Text using System Drawing using System IO n
  • 《当程序员的那些狗日日子》六

    当程序员的那些狗日日子 五十一 太不给力的年终奖 2009年12月中旬 敖总请研发部各人去台湾六天游 这是敖总每年一次的对研发部同仁的特别恩惠 此外此次台湾游敖总还请了负责技术支持的另外三位同事一同前往 由于办证及其他原因 最后只有立经理
  • Tips系列之飞书云文档

    飞书云文档可谓是飞书套件中深受用户喜爱的功能之一 今天就给大家呈上几个小Tips 让你深入了解飞书云文档 1 新建在线文档 表格和文件夹 电脑桌面端 方式 1 点击飞书桌面端左侧的云文档按钮 登录云文档首页 点击云文档首页右上角新建按钮 选
  • Qtimer使用多次connect的误区

    本人目前小白一枚 所及问题只为方便查看 忘大神们勿喷 有指导意见的本人会很高兴 在使用一个定时器时多次调用start 和stop 时完全没有问题的 先讲一下是start 的作用 Qt的帮助文档如下 This is an overloaded
  • 直接修改gba_修改GBA游戏本身

    满意答案 vhewq 2013 07 14 采纳率 42 等级 11 已帮助 7209人 如何Hack GBA ROM 作者 zhaosili zZ 转载请注明 本文假定你已经了解80x86汇编 尽管指令集不同 并且会使用TRW2000 尽
  • 蓝桥杯练习系统题解目录

    蓝桥杯历年省赛试题汇总及试题详解 https blog csdn net weixin 42069140 article details 88910340 蓝桥杯历年决赛试题汇总及试题详解 https blog csdn net weixi
  • 原生JS实现视频上传

    原生JS实现视频上传可以通过以下步骤实现 在HTML中添加一个文件输入框和一个提交按钮
  • 从CMOS到触发器(二)

    1 双稳态器件 双稳态器件是指稳定状态有两种 一种是0 一种是1的器件 双稳态器件是存储器件的基本模块 双稳器件的的一种电路结构是 交叉耦合反相器 结构 如下图所示 连个反相器连在一起 这就构成了一个双稳态器件 为什么是双稳态呢 我们现在就
  • Qt 一个信号连接多个槽函数后的执行顺序

    当我们想一个信号触发多个槽函数的时候 又对执行顺序有要求 要么要知道这些槽函数的执行顺序 Qt5后 在信号发射后 槽函数会按照链接顺序执行 下面写个简单的例子来验证一下 环境 win10 Qt 5 13 0 QPushButton btn1
  • Docker入门到实践 (十四) Docker企业级容器镜像仓库HarBor的搭建与配置

    文章目录 一 前言 二 企业级容器镜像仓库HarBor的介绍 三 HarBor 特性 四 HarBor 组件介绍 五 HarBor 与 Registry的区别 六 HarBor的安装与配置 1 安装环境要求 1 1 硬件要求 1 2 软件要
  • sqli-labs Less-5 (报错注入)

    在实际场景中 如果没有一个合适的数据返回点 而是仅仅带入Sql数据进行查询 就需要报错注入 1 less 5 正常情况 我们构造闭合 发现没有问题 利用前几关的思路 发现无论怎么操作都是 You are in 这个时候一般的思路就行不通 发
  • 视频合并python

    不同尺寸 不同个数的视频都可以合并 左右拼接 from moviepy editor import clips VideoFileClip r A 0000 raw converted avi VideoFileClip r bird A
  • tf.image.non_max_suppression()会扩充数据

    tf image non max suppression boxes scores max output size iou threshold 0 5 score threshold float inf name None tf image
  • cookie,session,token的区别和作用

    1 cookie session token的出现的背景 很久很久以前 Web 基本上就是文档的浏览而已 既然是浏览 作为服务器 不需要记录谁在某一段时间里都浏览了什么文档 每次请求都是一个新的HTTP协议 就是请求加响应 尤其是我不用记住

随机推荐

  • Unity自定义序列帧播放器

    目录 创建原因 一 主要功能 1 播放 从指定帧播放 2 跳转到指定帧 3 暂停 和 停止 4 播放完成回调 二 代码 创建原因 使用Animator进行序列帧控制的话 播放到指定帧 重新播放这些操作使用起来非常的不方便 所以自己写了一个序
  • uni-app项目中 component is 使用时 h5生效 小程序中渲染等不支持,下面有解决方法

    前言 由于公司业务调整 特意学习下uni项目框架 其实根据官方api就是实现很多功能 其实都是一些小坑要走 下面来说一下uni app项目中 component is 使用时 h5生效 小程序中渲染支付宝等不支持 下面有解决方法 查了下官网
  • AcWing 376. 机器任务(最小点覆盖&&匈牙利算法)

    输入样例 5 5 10 0 1 1 1 1 2 2 1 3 3 1 4 4 2 1 5 2 2 6 2 3 7 2 4 8 3 3 9 4 3 0 输出样例 3 解析 二分图最小点覆盖 最大匹配数 所以跑一边匈牙利算法即可 include
  • 用NVivo图表培养您的视觉素养

    NVivo是一款支持定性研究方法和混合研究方法的软件 它可以帮助您收集 整理和分析访谈 焦点小组讨论 问卷调查 音频等内容 全新的NVivo12更可协助您处理社交媒体和网页内容 NVivo强大的搜索 查询和可视化工具使您可以深入地分析您的数
  • 深度学习三(PyTorch物体检测实战)

    深度学习三 PyTorch物体检测实战 文章目录 深度学习三 PyTorch物体检测实战 1 网络骨架 Backbone 1 1 神经网络基本组成 1 1 1 卷积层 1 1 2 激活函数层 1 1 3 池化层 1 1 4 Dropout层
  • Open3d读写ply点云文件

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 1 Open3d 安
  • (收藏)强烈推荐几个学习数据结构和算法的网站和可视化工具

    一 学算法必去的一个网站 首先有一个网站那是每一个学习数据结构与算法都必须去的网站 说出来你就知道了 那就是大名鼎鼎的LeetCode 链接直达 https leetcode com 中文版长这个样子的 点开探索给你看看 强烈推荐人手一个啊
  • The evil CMake -- Compile bug, missing ')', error line number

    In case our CMakeLists txt have following codes following sentence should be wirte as FILE TO NATIVE PATH CMAKE SOURCE D
  • 蓝桥杯——七段码(并查集+二进制情况罗列)

    问题网站 https www lanqiao cn problems 595 learning contest id 73 这道题就是相邻的段可以表示一种符号 最少必须要有一段 其实我最初的想法就是把全部的符号表示按照符号个数分别罗列出来
  • 浅谈子网掩码

    一 IP地址 1 A类地址 范围 0 0 0 0 127 255 255 255 网络数 128 主机数 16777216 2 B类地址 范围 128 0 0 0 191 255 255 255 网络数 16384 主机数 65535 3
  • STM32控制舵机及其原理

    大家先看懂这张图 我们就是根据这张图 实现定时器产生PWM控制舵机旋转 本次采用的STM32F1单片机控制S90舵机 直接COPY就可以使用 经过本人实测 采用PB13 定时器1PWM通道1实现本次的控制 从0度控制180度旋转改变占空比实
  • Spring Security3.1 最新配置实例 .

    这几天学习了一下Spring Security3 1 从官网下载了Spring Security3 1版本进行练习 经过多次尝试才摸清了其中的一些原理 本人不才 希望能帮助大家 还有 这次我第二次写博客啊 文体不是很行 希望能让观看者不产生
  • 敏捷项目编程:从乙方视角探讨

    敏捷开发是一种迭代 增量的软件开发方法 强调快速响应变化 持续交付和紧密合作 在敏捷项目中 编程是一个至关重要的环节 乙方 开发团队 在其中扮演着关键的角色 本文将从乙方视角出发 详细探讨敏捷项目编程的相关内容 并提供相应的源代码示例 敏捷
  • 关于Qt5.12.0找不到Qmysql的问题解决方法

    这是第二次需要自己编译Qt库 上一次是需要用到MQTT Qt找不到库也是需要自己编译 项目需要用到数据库 学习途中发现了一些问题 故记录一下 网上看了是因为新版不支持mysql了 需要自己编译 本文章的解决方法就是通过编译mysql 如下图
  • AntD-tree组件使用详析

    目录 一 selectedKeys与onSelect 官方文档 代码演示 onSelect 注意事项 二 expandedKeys与onExpand 官方文档 代码演示 onExpand 注意事项 三 loadedKeys与onLoad和o
  • 【whr的深度学习总结1】使用Matconvnet训练imbalance全连接网络

    matconvnet只提供了卷积函数 并没有提供全连接函数 那么如何在卷积函数上训练全连接呢 首先 我们要清楚一件事 卷积核为1 1同时步长是1的网络就是全连接 那么配置网络的时候就只需执行卷积函数 同时配置卷积核的大小就可以 这是我的配置
  • 13种老人不适合带孩子_如果是这3种老人,并不建议他们带孩子,不是偏见是为孩子好...

    文 勤亲妈妈 文章原创 欢迎个人转发分享 孩子是一个家庭生命的传承 是全家人的 掌中宝 有了孩子之后 不只是父母的心思和注意力会放在孩子身上 就连老人对孩子也是非常的宠爱 都说 隔辈儿亲 隔辈儿亲 老人对孩子的爱是毋庸置疑的 上了年纪之后
  • uniapp如何使用uview中的loadmore上拉加载

    效果 引入loadmore 首先搜索和tab的样式
  • 016 Java中 int、Integer和 new Integer() 使用==比较

    Java中 int Integer和 new Integer 使用 比较 int则是java的一种基本数据类型 其定义的是基本数据类型变量 Integer是int的包装类 其定义的是引用类型变量 基本数据类类型存的是数值本身 引用类型变量在
  • React Navigation 5.x第八章 导航器的生命周期

    在之前的章节中 我们学会了使用stack导航器 其有两个页面 Home和Details 并且知道如何使用navigation navigate RouteName 在两个路由之间跳转 在这篇文章中 我们主要了解当我们离开Home页面的时候都