diff --git a/zh-cn/application-dev/ui/arkts-navigation-introduction.md b/zh-cn/application-dev/ui/arkts-navigation-introduction.md index 9515dbf0a8efc1cdbe44426307dd6e2cdeb5e807..16443631c61640cbfc5c1ec50ccac15ef6c388ef 100644 --- a/zh-cn/application-dev/ui/arkts-navigation-introduction.md +++ b/zh-cn/application-dev/ui/arkts-navigation-introduction.md @@ -1,6 +1,11 @@ # 组件导航和页面路由概述 -组件导航(Navigation)和页面路由(@ohos.router)均支持应用内的页面跳转,但组件导航支持在组件内部进行跳转,使用更灵活。组件导航具备更强的一次开发多端部署能力,可以进行更加灵活的页面栈操作,同时支持更丰富的动效和生命周期。因此,推荐使用组件导航(Navigation)来实现页面跳转以及组件内的跳转,以获得更佳的使用体验。 +页面是指由控件、布局、视觉元素等构成的可视化交互单元,承载着特定功能逻辑与信息展示,是用户与应用进行操作交互的核心界面载体。一个完整的应用往往由多个页面组成,组件导航(Navigation)和页面路由(@ohos.router)均提供了应用内的页面跳转能力。 + +- 在组件导航(Navigation)框架下,“页面”通过NavDestination组件承载,特指一个NavDestination组件包含的内容。 +- 在页面路由(@ohos.router)框架下,“页面”特指@Entry装饰的自定义组件。 + +相较而言,组件导航(Navigation)将页面放在Navigation组件内部进行跳转,具备更强的一次开发多端部署能力,可以进行更加灵活的页面栈操作,同时支持更丰富的动效和生命周期。因此,推荐使用组件导航(Navigation)来实现页面跳转以及组件内的跳转,以获得更佳的使用体验。 ## 架构差异 diff --git a/zh-cn/application-dev/ui/arkts-routing.md b/zh-cn/application-dev/ui/arkts-routing.md index 20824ec30f7d6dc787f5b7b10316d69c6e47c881..10b9d2ad8c23965bf8f1cf75cd7bd5e8bf1efb87 100644 --- a/zh-cn/application-dev/ui/arkts-routing.md +++ b/zh-cn/application-dev/ui/arkts-routing.md @@ -264,6 +264,95 @@ struct Home { > > 另外,如果使用back方法返回到原来的页面,原页面不会被重复创建,因此使用\@State声明的变量不会重复声明,也不会触发页面的aboutToAppear生命周期回调。如果需要在原页面中使用返回页面传递的自定义参数,可以在需要的位置进行参数解析。例如,在onPageShow生命周期回调中进行参数解析。 +## 生命周期 + +[router](../reference/apis-arkui/js-apis-router.md)页面生命周期,即被[\@Entry](state-management/arkts-create-custom-components.md#entry)装饰的组件生命周期,提供以下生命周期接口: + +- [onPageShow](../reference/apis-arkui/arkui-ts/ts-custom-component-lifecycle.md#onpageshow):页面每次显示时触发一次,包括路由过程、应用进入前台等场景。 + +- [onPageHide](../reference/apis-arkui/arkui-ts/ts-custom-component-lifecycle.md#onpagehide):页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。 + +- [onBackPress](../reference/apis-arkui/arkui-ts/ts-custom-component-lifecycle.md#onbackpress):当用户点击返回按钮时触发。 + +```ts +// Index.ets +@Entry +@Component +struct MyComponent { + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onPageShow() { + console.info('Index onPageShow'); + } + + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onPageHide() { + console.info('Index onPageHide'); + } + + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onBackPress() { + console.info('Index onBackPress'); + // 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理 + return true; + } + + build() { + Column() { + // push到Page页面,执行onPageHide + Button('push to next page') + .onClick(() => { + this.getUIContext().getRouter().pushUrl({ url: 'pages/Page' }); + }) + } + } +} +``` +```ts +// Page.ets +@Entry +@Component +struct Page { + @State textColor: Color = Color.Black; + @State num: number = 0; + + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onPageShow() { + console.info('Page onPageShow'); + this.num = 5; + } + + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onPageHide() { + console.info('Page onPageHide'); + } + + // 只有被@Entry装饰的组件才可以调用页面的生命周期 + onBackPress() { // 不设置返回值按照false处理 + console.info('Page onBackPress'); + this.textColor = Color.Grey; + this.num = 0; + } + + build() { + Column() { + Text(`num 的值为:${this.num}`) + .fontSize(30) + .fontWeight(FontWeight.Bold) + .fontColor(this.textColor) + .margin(20) + .onClick(() => { + this.num += 5; + }) + Button('pop to previous page') + .onClick(() => { + this.getUIContext().getRouter().back(); + }) + } + .width('100%') + } +} +``` +![router_2025-07-02_152548](figures/router_2025-07-02_152548.gif) ## 页面返回前增加一个询问框 diff --git a/zh-cn/application-dev/ui/figures/router_2025-07-02_152548.gif b/zh-cn/application-dev/ui/figures/router_2025-07-02_152548.gif new file mode 100644 index 0000000000000000000000000000000000000000..7f9fc821f6c4f84f78ca4968cf754f73ae80ccaa Binary files /dev/null and b/zh-cn/application-dev/ui/figures/router_2025-07-02_152548.gif differ