HarmonyOS 鸿蒙Next数据回调问题

HarmonyOS 鸿蒙Next数据回调问题 A页面进行同步/异步网络请求,A的子组件进行数据使用,在子组件的aboutToApper中使用,传递来的数据.会显示没有数据.传递方式 @param

6 回复

aboutToAppear函数

aboutToAppear函数在创建自定义组件的新实例后,在其build()函数执行前调用。

问题描述

A页面进行同步/异步网络请求还没完成,子组件已经开始执行aboutToAppear函数。所以导致子组件中aboutToApper函数无法拿到A页面执行网络请求成功后的数据信息。

但是如果A页面进行同步/异步网络请求后,并成功获取返回后的数据信息,把数据传递给子组件,子组件还是能同步更新数据信息的。

示例代码如下:

@Entry
@ComponentV2
struct Index {
  @Local count: number = 0;
  getHttps() {
    // 每一个httpRequest对应一个HTTP请求任务,不可复用
    let httpRequest = http.createHttp();
    // 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
    // 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。
    httpRequest.on('headersReceive', (header) => {
      console.info('header: ' + JSON.stringify(header));
    });
    httpRequest.request(
      // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
      "https://www.baidu.com",
      {
        method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
        // 开发者根据自身业务需要添加header字段
        header: {
          'Content-Type': 'application/json'
        },
        // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
        extraData: "data to send",
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
        usingCache: true, // 可选,默认为true
        priority: 1, // 可选,默认为1
        connectTimeout: 60000, // 可选,默认为60000ms
        readTimeout: 60000, // 可选,默认为60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
        usingProxy: false, // 可选,默认不使用网络代理,自API 10开始支持该属性
      }, (err: BusinessError, data: http.HttpResponse) => {
      if (!err) {
        // data.result为HTTP响应内容,可根据业务需要进行解析
        console.info('Result:' + JSON.stringify(data.result));
        console.info('code:' + JSON.stringify(data.responseCode));
        this.count = data.responseCode
        // data.header为HTTP响应头,可根据业务需要进行解析
        console.info('header:' + JSON.stringify(data.header));
        console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy();
      } else {
        console.error('error:' + JSON.stringify(err));
        // 取消订阅HTTP响应头事件
        httpRequest.off('headersReceive');
        // 当该请求使用完毕时,调用destroy方法主动销毁
        httpRequest.destroy();
      }
    }
    );
  }
  build() {
    Column() {
      Text(`Local ${this.count}`)
      Button('change Local')
        .onClick(()=>{
          // 对数据源的更改会同步给子组件
          // this.count++;
          this.getHttps()
        })
      Child({
        count: this.count,
      })
    }
  }
}
@ComponentV2
struct Child {
  @Require @Param count: number;
  build() {
    Column() {
      Text(`Param ${this.count}`)
    }
  }
}

更多关于HarmonyOS 鸿蒙Next数据回调问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,这个点击事件的话肯定是没有问题的.你写在aboutToApper 或者做一个超时的操作 模拟下,

在A页面aboutToAppear函数中执行网络数据请求,然后在子组件中aboutToAppear函数中延迟获取数据信息,这样操作是可以的。

aboutToAppear(): void {
    setTimeout(() => {
      console.info('count'+ this.count)
    }, 1000)
  }

核心原因是网络请求异步执行,子组件aboutToAppear执行时数据尚未返回,导致子组件拿到空值。解决方案围绕“确保子组件在数据就绪后再使用”展开

我认为可以使用子组件加“数据存在判断”

在子组件使用数据的地方,先判断数据是否存在,避免空值报错,同时可显示加载态提升体验。

鸿蒙Next的数据回调基于ArkTS的异步编程机制实现。通过@Watch装饰器监听状态变量变化,或使用回调函数处理异步操作结果。在事件驱动架构中,可通过emit触发自定义事件并传递数据。需注意避免循环回调,确保数据流单向性。

在HarmonyOS Next中,通过@param传递数据到子组件时,如果子组件的aboutToAppear中数据未显示,可能是因为父组件的数据请求尚未完成,导致数据未及时传递。建议在父组件中使用状态管理或异步回调确保数据加载完成后再传递给子组件,例如通过@State@Prop结合Promise或异步方法处理数据流。

回到顶部