鸿蒙-生命周期钩子

如何区分组件和页面

有@Entry的,就是页面。
没有的就是组件

生命周期

image

组件有生命周期钩子

onPageShow:每次显示时触发(路由过程、应用进入前台)
onPageHide:每次隐藏触发(路由过程、应用进入后台)
aboutToAppear:创建(页面/组件)实例后执行,可以修改状态变量。(组件/页面)
aboutToDisappear:销毁(页面/组件)实例前执行,不允许修改状态变量。(组件/页面)
onBackPress:点击返回触发(return true) 阻止返回键默认返回效果

组件有aboutToAppear和aboutToDisappear这2个生命周期钩子函数

aboutToAppear:创建(页面/组件)实例后执行,可以修改状态变量。(组件/页面)
aboutToDisappear:销毁(页面/组件)实例前执行,不允许修改状态变量。(组件/页面)

页面中有组件生命周期钩子执行顺序(先外后里)

现在我们给页面中有一个子组件,通过 show 这个变量来进行控制:是否显示。
在初始的时候,肯定是会执行页面中的 aboutToAppea 这个钩子
当 show 为true的时候,执行子组件的 aboutToAppea 这个钩子
当 show由true变为false的时候,执行子组件的 aboutToDisappear这个钩子
如果show始终是false,子组件就不会被创建出来 。就不会执行钩子函数(aboutToAppear)

@Component
struct Child {
  aboutToAppear(): void {
    console.log('子组件:创建组件实例后执行,可以修改状态变量')
  }
  aboutToDisappear(): void {
    console.log('子组件:组件实例销毁前执行,不允许修改状态变量')
  }
  build() {
      Row(){
        Text('我是一个普通的子组件')
      }
  }
}
export default Child
import AChildA from '../components/Child'
@Entry
@Component
struct Login {
  @State show:boolean = true
  aboutToAppear(): void {
    console.log('页面:创建组件实例后执行,可以修改状态变量')
  }
  aboutToDisappear(): void {
    console.log('页面:组件实例销毁前执行,不允许修改状态变量')
  }
  build() {
    Column(){
      Text('组件的生命周期')
       Button('是否显示组件').onClick(()=>{
        this.show = !this.show
       })
        if(this.show){
          AChildA()
        }
    }
  }
}

image

总结:先执行外层在执行里层的钩子

页面初始化时会执行哪些钩子(刷新当前页面)

父页面的:aboutToAppear == 》 子组件的aboutToAppear ==》 父页面的 onPageShow
image

使用 pushUrl 由A页面跳转到B页面会执行哪些钩子函数

B页面的:aboutToAppear ==》 A页面的:onPageHide ===》B页面的:onPageShow
image

如果从B页面返回A页面会执行哪些钩子

B页面的:onBackPress===》 B页面的:onPageHide ===》 A页面的:onPageShow ==》 B页面的:aboutToDisappear
image

posted @ 2025-07-08 19:21  南风晚来晚相识  阅读(61)  评论(0)    收藏  举报