【每日学点HarmonyOS Next知识】web网络拦截、对话框、网页重定向、数据作用域、多线程

发布于:2025-03-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

【每日学点HarmonyOS Next知识】web网络拦截、对话框、网页重定向、数据作用域、多线程

1、HarmonyOS 在web网络拦截情况下,在网络失败情况下,web组件的onErrorReceive和onHttpErrorReceive均未回调?

在网络拦截情况下,在网络失败情况下,web组件的onErrorReceive和onHttpErrorReceive均未回调 拦截接口使用如下: OH_ArkWeb_CreateResponse(&arkResponse); OH_ArkWebResponse_SetError(arkResponse, ARKWEB_ERR_FAILED); OH_ArkWebResourceHandler_DidReceiveResponse(arkResourceHandler, arkResponse);

如果在response阶段发生错误 通过response->seterror来回调 如果是数据传输过程中发生错误 用OH_ArkWebResourceHandler_DidFailWithError

2、HarmonyOS openCustomDialog 进入新页面后dialog出现在新页面?

openCustomDialog 进入新页面后dialog出现在新页面

方案是跳转页面时先关闭dialog回来再打开,可以使用全局变量来控制弹窗的关闭和显示参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-appstorage-V5

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。

和AppStorage不同的是,LocalStorage是页面级的,通常应用于页面内的数据共享。而AppStorage是应用级的全局状态共享,还相当于整个应用的“中枢”,持久化数据PersistentStorage和环境变量Environment都是通过AppStorage中转,才可以和UI交互。

本文仅介绍AppStorage使用场景和相关的装饰器:@StorageProp和@StorageLink。

AppStorage是应用全局的UI状态存储,不同于@State等装饰器仅能在组件树上传递,AppStorage的目的是为了给开发者提供更大范围的跨ability基本的数据共享。在阅读本文档前,建议开发者对状态管理框架中AppStorage的定位有一个宏观了解。建议提前阅读:状态管理概述。

AppStorage还提供了API接口,可以让开发者通过接口在自定义组件外手动触发AppStorage对应key的增删改查,建议配合AppStorage API文档阅读。

3、HarmonyOS ArkWeb网页重定向问题?

如果是在web组件中,可以使用onLoadIntercept判断重定向,进行相关操作,文档可参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-web-V5#onloadintercept10

4、HarmonyOS 自定义组件的自定义布局 数据的作用域不对?

参考代码:

import { TeacherInfoModel } from './TeacherInfoModel';
import { promptAction } from '@kit.ArkUI';

@Observed
export class TeacherInfoViewModel {
  teacherInfoModel: TeacherInfoModel = new TeacherInfoModel();

  changeId(id: string): TeacherInfoModel {
    this.teacherInfoModel.id = id;
    return this.teacherInfoModel;
  }

  //检查
  checkModel(teacherInfoModel: TeacherInfoModel) {
    this.teacherInfoModel = teacherInfoModel;
  }
}
import { getTeacherInfoModel, TeacherInfoModel } from '../comp/TeacherInfoModel';
import { TeacherInfoViewModel } from '../comp/TeacherInfoViewModel';
import { CommComponent } from './CommComponent';
import { ComponentStatus } from './CommonEnums';
import { promptAction } from '@kit.ArkUI';

@Entry
@Component
struct Index {
  @State teacherInfoViewModel: TeacherInfoViewModel = new TeacherInfoViewModel();
  @State state: ComponentStatus = ComponentStatus.LOADING

  aboutToAppear(): void {
    this.state = ComponentStatus.LOADING;
    //发起网络请求
    this.requestNetWork();
  }

  private requestNetWork() {
    getTeacherInfoModel("参数").then((res: TeacherInfoModel) => {
      this.teacherInfoViewModel.checkModel(res);
      this.state = ComponentStatus.SUCCESS;
    });
  }

  build() {
    Row() {
      Column() {
        CommComponent({
          componentStatus: this.state,
          data: this.teacherInfoViewModel.teacherInfoModel,
          builder: () => {
            this.successBuild()
          },
          builderLoading: () => {
            this.loadingBuild()
          }
        }).onClick((e) => {
          this.requestNetWork();
        })
      }
      .width('100%')
    }
    .height('100%')
  }

  @Builder
  successBuild() {

    //问题1 id数据不会更新

    Column() {
      Text(`网络数据:${this.teacherInfoViewModel?.teacherInfoModel?.id} `)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
    }
    .width('100%')

    .onClick(() => {

      //问题: 点击重新请求 后看问题1 ID不会更新
      let param = this.teacherInfoViewModel.changeId("onClickID") as TeacherInfoModel

      //此处仅用到@State,直接修改对象从而触发UI刷新
      let teacherInfoViewModelTemp: TeacherInfoViewModel = new TeacherInfoViewModel()
      teacherInfoViewModelTemp.teacherInfoModel = param
      this.teacherInfoViewModel = teacherInfoViewModelTemp

      promptAction.showToast({ message: `更新后的id为${JSON.stringify(param)}` })


    })
  }

  @Builder
  loadingBuild() {
    Column() {
      Text(`Loading... `)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
    }
    .width('100%')

  }
}
5、HarmonyOS 能够在主线程给 Worker 传递一个函数,让这个函数在 Worker 的线程中执行么?

能够在主线程给 Worker 传递一个函数,让这个函数在 Worker 的线程中执行么?

尝试以下方案,在主线程中定义一个函数,并通过Worker的onmessage接口将这个函数传递给Worker线程执行。

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-worker-V5#onmessage9


网站公告

今日签到

点亮在社区的每一天
去签到