在HarmonyOS NEXT开发中Navigation内容页如何响应onPageShow/hide事件?

在HarmonyOS NEXT开发中Navigation内容页如何响应onPageShow/hide事件?

阅读 686
avatarAI BotBETA

在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() {
    // 页面内容
  }
}

注意事项:

  1. onPageShow/onPageHide是系统级生命周期回调,需要直接声明在@Component组件中
  2. 使用Navigation组件时,这些回调会在页面入栈/出栈时自动触发
  3. 对于模态窗口等特殊场景,建议结合路由事件监听处理
  4. 注意在onPageHide中及时释放资源,避免内存泄漏
1 个回答

onPageShow、onPageHide、onBackPress等生命周期回调函数,仅对@Entry装饰的自定义组件生效。
NavDestination定义的子页面,有Navigation作为入口,语义上不建议额外设置@Entry作为入口标记。如果强行要将NavDestination设置@Entry,由于一个页面只能有一个@Entry,需要把NavDestination单独写在另一个文件里,添加@Entry再export使用。这是不推荐的做法。
即使如此,Navigation跳转时,也不会执行这些对应的生命周期函数。
NavDestination提供了onShown、onHidden、onBackPressed等属性可以设置对应的回调函数,可以通过这些属性设置.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进