HarmonyOS鸿蒙Next中组件的aboutToAppear、onPageShow、aboutToDisappear等生命周期如何使用?

HarmonyOS鸿蒙Next中组件的aboutToAppear、onPageShow、aboutToDisappear等生命周期如何使用? 我需要在组件显示时加载数据,隐藏时清理资源,想了解:

  1. aboutToAppear() 和 aboutToDisappear() 的触发时机是什么?
  2. onPageShow() 和 onPageHide() 与 aboutToAppear/Disappear 有什么区别?
  3. 如何在 aboutToAppear 中执行异步数据加载?
  4. 如何在 aboutToDisappear 中清理定时器、取消订阅?
  5. @Entry 页面组件与普通 @Component 组件的生命周期有什么区别?

希望能获取组件生命周期的详细说明和代码示例。


更多关于HarmonyOS鸿蒙Next中组件的aboutToAppear、onPageShow、aboutToDisappear等生命周期如何使用?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

实现思路:

  1. aboutToAppear 在组件即将显示时调用(build 之前),适合初始化数据:
async aboutToAppear() {
  console.info('aboutToAppear');
  await this.loadData();
  this.timer = setInterval(() => {
    console.info('Timer tick');
  }, 5000);
}
  1. onPageShow 在页面显示时调用(包括从后台返回),适合刷新数据:
onPageShow() {
  console.info('onPageShow');
  this.refreshData();
}
  1. aboutToDisappear 在组件即将销毁时调用,必须清理定时器等资源:
aboutToDisappear() {
  console.info('aboutToDisappear');
  if (this.timer !== -1) {
    clearInterval(this.timer);
    this.timer = -1;
  }
}
  1. 完整示例代码:
@Entry
@Component
struct LifecycleExample {
  @State dataList: DataItem[] = [];
  @State isLoading: boolean = true;
  private timer: number = -1;

  async aboutToAppear() {
    console.info('aboutToAppear - 组件即将显示');
    await this.loadData();
    
    // 启动定时器
    this.timer = setInterval(() => {
      console.info('Timer tick');
    }, 5000);
  }

  onPageShow() {
    console.info('onPageShow - 页面显示');
    // 页面从后台返回时刷新数据
  }

  onPageHide() {
    console.info('onPageHide - 页面隐藏');
  }

  onBackPress(): boolean {
    console.info('onBackPress - 用户按返回键');
    return false;  // false 表示执行默认返回
  }

  aboutToDisappear() {
    console.info('aboutToDisappear - 组件即将销毁');
    // ⭐ 必须清理定时器,避免内存泄漏
    if (this.timer !== -1) {
      clearInterval(this.timer);
      this.timer = -1;
    }
  }

  async loadData(): Promise<void> {
    this.isLoading = true;
    try {
      await new Promise(resolve => setTimeout(resolve, 1000));
      this.dataList = [
        { id: '1', name: 'Item 1' },
        { id: '2', name: 'Item 2' }
      ];
    } finally {
      this.isLoading = false;
    }
  }

  build() {
    Column({ space: 16 }) {
      if (this.isLoading) {
        LoadingProgress().width(40).height(40)
      } else {
        ForEach(this.dataList, (item: DataItem) => {
          Text(item.name).fontSize(16)
        })
      }
    }
    .width('100%')
    .padding(16)
  }
}

interface DataItem {
  id: string;
  name: string;
}

更多关于HarmonyOS鸿蒙Next中组件的aboutToAppear、onPageShow、aboutToDisappear等生命周期如何使用?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,组件的生命周期函数使用如下:

  • aboutToAppear:组件即将出现时调用,用于初始化数据。
  • onPageShow:页面显示时触发,适合执行页面显示后的操作。
  • aboutToDisappear:组件即将消失时调用,用于清理资源。

这些函数在ArkTS组件中直接定义即可,系统会在对应时机自动调用。

在HarmonyOS Next中,组件的生命周期管理是开发中的核心。以下是针对您问题的具体解答:

1. aboutToAppear() 与 aboutToDisappear()

  • aboutToAppear():在组件即将显示、完成初始化但尚未渲染时触发。这是执行数据初始化的理想位置。
  • aboutToDisappear():在组件即将从视图树中移除或销毁前触发。用于执行必要的清理工作。

2. onPageShow()/onPageHide() 与 aboutToAppear/Disappear 的区别

关键区别在于作用域:

  • onPageShow()/onPageHide()页面 的生命周期回调,仅对使用 [@Entry](/user/Entry) 装饰的页面组件有效。它们在整个页面显示或隐藏(例如导航跳转、应用退到后台)时触发。
  • aboutToAppear()/aboutToDisappear()组件 的生命周期回调,对所有 [@Component](/user/Component) 组件(包括页面组件)都有效。它们在组件自身创建/挂载或销毁/卸载时触发。

关系:对于一个 [@Entry](/user/Entry) 页面,当页面打开时,会先触发页面的 aboutToAppear(),再触发 onPageShow()。当页面关闭时,先触发 onPageHide(),再触发 aboutToDisappear()

3. 在 aboutToAppear 中执行异步数据加载

可以直接在 aboutToAppear() 中调用异步方法或使用 async/await。但需要注意,它不会阻塞UI渲染。

[@Entry](/user/Entry)
[@Component](/user/Component)
struct MyPage {
  @State dataList: string[] = [];

  aboutToAppear() {
    // 方式1:调用异步函数
    this.loadDataAsync();

    // 方式2:直接使用 async/await
    // this.loadDataWithAwait();
  }

  // 异步加载数据函数
  async loadDataAsync() {
    try {
      const data = await this.fetchDataFromNetwork(); // 模拟网络请求
      this.dataList = data;
    } catch (error) {
      console.error('数据加载失败:', error);
    }
  }

  // 模拟网络请求
  private async fetchDataFromNetwork(): Promise<string[]> {
    // 实际开发中替换为真实的异步请求
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(['Item 1', 'Item 2', 'Item 3']);
      }, 1000);
    });
  }
}

4. 在 aboutToDisappear 中清理资源

aboutToDisappear() 中直接清理定时器、取消事件订阅或释放其他资源。

[@Component](/user/Component)
struct MyComponent {
  private timerId: number | undefined;
  private eventSubscription: emitter.EventSubscription | undefined;

  aboutToAppear() {
    // 启动定时器
    this.timerId = setInterval(() => {
      console.log('Timer tick');
    }, 1000);

    // 订阅事件
    this.eventSubscription = emitter.on('myEvent', (data) => {
      console.log('Event received:', data);
    });
  }

  aboutToDisappear() {
    // 1. 清除定时器
    if (this.timerId !== undefined) {
      clearInterval(this.timerId);
      this.timerId = undefined;
    }

    // 2. 取消事件订阅
    if (this.eventSubscription !== undefined) {
      this.eventSubscription.off(); // 取消订阅
      this.eventSubscription = undefined;
    }

    // 3. 其他资源清理(如取消未完成的网络请求)
    console.log('Component resources cleaned up.');
  }
}

5. @Entry 页面组件与普通 @Component 组件的生命周期区别

  • @Entry 页面组件:拥有完整的生命周期,包括 组件级aboutToAppear/aboutToDisappear页面级onPageShow/onPageHide/onBackPress。它作为应用的入口页面或路由的目标页。
  • 普通 @Component 组件:仅拥有组件级的生命周期,即 aboutToAppearaboutToDisappear。它作为页面内的可复用UI单元。

总结:页面组件比普通组件多了页面级的生命周期回调,用于管理页面整体的显示状态。

回到顶部