
十二、路由、生命周期函数 原创
router路由
页面路由指的是在应用程序中实现不同页面之间的跳转,以及数据传递。通过 Router 模块就可以实现这个功
能
2.1创建页面
之前是创建的文件,使用路由的时候需要创建页面,步骤略有不同
- 方法 1:直接右键新建Page(常用)
- 方法 2:单独添加页面并配置
2.1.1直接右键新建Page
2.1.2单独添加页面并配置
1.新建页面
pages/DetailPage.ets
2.调整配置
:::success 小技巧:
- 按两次 shift
:::
:::success TIP
- 手动新建一个页面(ets)文件,需要在**main_pages.json**中手动配置
- 可以自动创建(会自动添加配置)
- 删除页面**不会**自动删除配置,需要手动删除
:::
2.2.页面跳转
接下来学习路由的跳转,页面跳转是开发过程中的一个重要组成部分。
在使用应用程序时,通常需要在不同的页面之间跳转,有时还需要将数据从一个页面传递到另一个页面。接下来咱们分场景来讲解这部分的内容:
- 页面跳转与后退
- 路由模式
- 参数传递
2.2.1页面跳转与后退
首先来看看看使用频率最高的 跳转和 后退,核心就是使用 router 的方法
:::info 试一试:
- 创建目录,管理页面,
- 在目录下添加:首页,详情页
- 页面 A 中分别使用pushUrl和replaceUrl跳转到页面 B
- 页面 B 测试 back
:::
:::info router.pushUrl() 和 router.replaceUrl()。都可以跳转页面,区别为是否会替换当前页。
- router.pushUrl():目标页面不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用router.back()方法返回到当前页。
- router.replaceUrl():目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。
划重点:pushUrl 可以返回 replaceUrl 无法返回
:::
2.2.2页面栈
页面栈是用来存储程序运行时页面的一种数据结构,遵循先进后出的原则,咱们结合刚刚的代码来说明一下:
:::info 页面栈的最大容量为32个页面
:::
2.2.2.1pushUrl的情况
先来看看 pushUrl的情况
1默认打开首页 → 首页入栈
2pushUrl 去详情页 → 详情页入栈
3back 返回上一页 → 详情页出栈
4此时页面栈中应该只有一个页面
整一个过程中,都可以 router.getLength 进行查看
2.2.2.2replaceUrl 的情况
再来看看replaceUrl的情况
1默认打开首页 → 首页入栈
2replaceUrl 去详情页 → 详情页替换首页,首页销毁
3back 无法返回 → 没有上一页
2.2.2.3页面栈相关 api
为了让咱们更好的获取页面栈的信息,router 模块也提供了对应的 api 以供使用
2.3路由模式
路由提供了两种不同的跳转模式,不同模式的决定了页面是否会创建多个实例
●Standard:多实例模式,也是默认情况下的跳转模式。目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。
●Single:单实例模式。如果目标页面的url已经存在于页面栈中,则会将离栈顶最近的同url页面移动到栈顶,该页面成为新建页。如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。
:::info
简而言之:
1Standard:无论之前是否添加过,一直添加到页面栈【常用】
2Single:如果之前加过页面,会使用之前添加的页面【看情况】
:::
参数名 | 类型 | 必填 | 说明 |
options | 是 | 跳转页面描述信息。 | |
mode | 是 | 跳转页面使用的模式。 |
RouterMode参数说明
名称 | 说明 |
Standard | 多实例模式,也是默认情况下的跳转模式。 目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。 说明:不使用路由跳转模式时,则按照默认的多实例模式进行跳转。 |
Single | 单实例模式。 如果目标页面的url已经存在于页面栈中,则该url页面移动到栈顶。 如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。 |
:::info
试一试:
1创建目录管理多个页面:
a01.HomePage
b02.MoviePage
c03.ActorPage
2整合基础模版
3分别测试两种路由模式:
:::
2.3.1Strandard模式
使用 Strandard 模式,在电影和演员页面反复跳转时会持续往页面栈中添加新的页面,浪费内存
2.3.2****Single模式
使用 Single 模式,在页面和演员页面反复跳转时会将已有的页面移到栈顶,避免浪费内存
2.4参数
接下来看看另外一个挺常见的需求:传递参数
日常开发中有这样的场景:点击不同的电影,商品,标题。。。跳转到与之对应的详情页面。
详情页面的布局是类似的,但是内容被替换为与之对应的内容。这就是一个常见的需要传递参数的场景:
列表 → 详情
2.4.1参数传递及接收
首先来看看如何实现页面参数传递和获取
options参数说明
名称 | 类型 | 必填 | 说明 |
url | string | 是 | 表示目标页面的url,可以用以下两种格式: - 页面绝对路径,由配置文件中pages列表提供,例如: - pages/index/index - pages/detail/detail - 特殊值,如果url的值是"/",则跳转到首页。 |
params | object | 否 | 表示路由跳转时要同时传递到目标页面的数据,切换到其他页面时,当前接收的数据失效。跳转到目标页面后,使用router.getParams()获取传递的参数 |
试一试:
1创建目录管理页面
a创建首页
b创建详情页
2【首页】携带数据去 【详情页】
3【详情页】接收并解析数据
:::
router路由案例-共享元素转场
当路由进行切换时,可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。
链接
动画属性
名称 | 参数类型 | 是否必填 | 参数描述 |
duration | number | 否 | 描述共享元素转场动效播放时长。 默认值:1000。 单位:毫秒。 |
curve | Curve | string | ICurve 10+ |
delay | number | 否 | 延迟播放时间。 默认值:0。 单位:毫秒。 |
motionPath | 否 | 运动路径信息。 | |
zIndex | number | 否 | 设置Z轴。 |
type | 否 | 动画类型。 默认值:SharedTransitionEffectType.Exchange。 |
:::info
试一试:
1基础基础模版实现,图片和文字的转场效果
:::
页面和自定义组件的生命周期
组件和页面在创建、显示、销毁的这一整个过程中,会自动执行 一系列的【生命周期钩子】,其实就是一系列的【函数】,让开发者有机会在特定的阶段运行自己的代码
在开始之前,我们先明确自定义组件和页面的关系:
●自定义组件:@Component 装饰的UI单元,
●页面:即应用的UI页面。可以由一个或者多个自定义组件组成。@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。
4.1组件-生命周期
仅仅 @Component 组件
aboutToAppear
●aboutToAppear 函数在创建自定义组件的新实例后,在执行其 build 函数之前执行。
●允许在 aboutToAppear 函数中改变状态变量,更改将在后续执行 build 函数中生效。
aboutToDisappear
●aboutToDisappear 函数在自定义组件析构销毁之前执行。
●不允许在 aboutToDisappear 函数中改变状态变量,特别是 @Link 变量的修改可能会导致应用程序行为不稳定。
4.2页面-生命周期
仅页面 @Entry 组件
onPageShow
●页面每次显示时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。
onPageHide
●页面每次隐藏时触发一次,包括路由过程、应用进入前后台等场景,仅 @Entry 修饰的自定义组件生效。
onBackPress
●当用户点击返回按钮时触发,仅 @Entry 修饰的自定义组件生效。
●内部如果返回 true,就无法通过返回键返回上一页,用户就必须和页面交互才可以返回
:::info 因为@Entry 也是@Component组件,所以页面组件同时拥有自定义组件的生命周期
:::
Navigation路由导航容器组件(推荐)
认识Navigation组件
Navigation相比于普通的容器组件,Navigation可以实现路由跳转。一般作为首页的根容器,包括单栏、分栏和自适应三种显示模式。适用于一次开发,多端部署场景。
/pɑːθ/
Navigation的路由跳转操作都是基于页面栈NavPathStack实例提供的方法进行,每个Navigation都需要创建并传入一个NavPathStack对象,用于管理页面。主要涉及页面跳转、页面返回、路由拦截等功能。
Navigation进行路由跳转的写法
具体的使用步骤是:
- 在根页面写法:
- 在子页面写法:
- 路由配置:
- module.json5中配置依赖
路由拦截
路由拦截在NavPathStack实例里面的willShow页面跳转前的回调里进行阻止判断的逻辑, 和使用pop()API , 进行阻断。
子页面继续路由跳转的两种方法
获取上下文对象。进而获取根页面路由栈实例(所有组件页面共享同一个实例)
还有一些属性
- title设置标题,
- memus设置右上角菜单,
- mode可以设置分栏
