在HarmonyOS NEXT开发中Navigation内容页如何响应onPageShow/hide事件?
在HarmonyOS NEXT开发中Navigation内容页如何响应onPageShow/hide事件?
在HarmonyOS NEXT的ArkUI开发中,可以通过以下两种方式响应页面显示/隐藏事件:
方法一:使用页面生命周期回调(推荐)
@Entry
@Component
struct MyPage {
// 页面显示时触发(首次进入或从其他页面返回)
onPageShow() {
console.log("Page visible")
}
// 页面隐藏时触发(跳转其他页面或离开)
onPageHide() {
console.log("Page hidden")
}
build() {
// 页面内容
}
}
方法二:通过路由事件监听
import router from '@ohos.router'
@Entry
@Component
struct Index {
private routeCallback = (event) => {
if (event.type === router.RouterEvent.BEFORE_ENTER) {
console.log("Page will show")
} else if (event.type === router.RouterEvent.BEFORE_LEAVE) {
console.log("Page will hide")
}
}
onPageShow() {
router.addListener(this.routeCallback)
}
onPageHide() {
router.removeListener(this.routeCallback)
}
build() {
// 页面内容
}
}
注意事项:
onPageShow/onPageHide
是系统级生命周期回调,需要直接声明在@Component
组件中onPageHide
中及时释放资源,避免内存泄漏
onPageShow、onPageHide、onBackPress等生命周期回调函数,仅对@Entry装饰的自定义组件生效。
NavDestination定义的子页面,有Navigation作为入口,语义上不建议额外设置@Entry作为入口标记。如果强行要将NavDestination设置@Entry,由于一个页面只能有一个@Entry,需要把NavDestination单独写在另一个文件里,添加@Entry再export使用。这是不推荐的做法。
即使如此,Navigation跳转时,也不会执行这些对应的生命周期函数。
NavDestination提供了onShown、onHidden、onBackPressed等属性可以设置对应的回调函数,可以通过这些属性设置.