写点什么

【每日学点 HarmonyOS Next 知识】防止重复点击、对话框收拾拦截、自定义键盘焦点、页面层级、自定义对话框创建

作者:轻口味
  • 2025-03-13
    北京
  • 本文字数:2343 字

    阅读完需:约 8 分钟

【每日学点HarmonyOS Next知识】防止重复点击、对话框收拾拦截、自定义键盘焦点、页面层级、自定义对话框创建

1、HarmonyOS onClick 点击事件,如何实现重复点击同一个按钮或 toggle,两次间隔时间过短则失效,来防止重复点击?

onClick 点击事件,如何实现重复点击同一个按钮或 toggle,两次间隔时间过短则失效,来防止重复点击


参考 demo:


//定义一个节流函数throttlefunction throttle(func: Function, interval: number) {  let lastTime = 0;  return () => {    const nowTime = Date.now();    const remainTime = interval - (nowTime - lastTime);    if (remainTime <= 0) {      lastTime = nowTime;      func();    }  };}//示例Button("防止重复点击").onClick(throttle(()=>{
},5000))
复制代码

2、HarmonyOS CustomDialog 弹窗,返回手势时会消失,在哪里可以拦截这个事件?

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-methods-custom-dialog-box-V5#ZH-CN_TOPIC_0000001884757950__customdialogcontrolleroptions%E5%AF%B9%E8%B1%A1%E8%AF%B4%E6%98%8E


说明:


  1. 当用户执行点击遮障层关闭、左滑/右滑、三键 back、键盘 ESC 关闭交互操作时,如果注册该回调函数,则不会立刻关闭弹窗。在回调函数中可以通过 reason 得到阻拦关闭弹窗的操作类型,从而根据原因选择是否能关闭弹窗。当前组件返回的 reason 中,暂不支持 CLOSE_BUTTON 的枚举值。

  2. 在 onWillDismiss 回调中,不能再做 onWillDismiss 拦截。

3、HarmonyOS 如何控制自定义键盘获取焦点和失去焦点?

如何控制自定义键盘获取焦点和失去焦点


参考 demo:


@Entry@Componentstruct TextInputExample {  controller: TextInputController = new TextInputController()  @State inputValue: string = ""
// 自定义键盘组件 @Builder CustomKeyboardBuilder() { Column() { Grid() { ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, '*', 0, '#'], (item:number|string) => { GridItem() { Button(item + "") .width(110).onClick(() => { this.inputValue += item }) } }) }.maxCount(3).columnsGap(10).rowsGap(10).padding(5) }.backgroundColor(Color.Gray) }
build() { Column() { Button('拉起键盘').onClick(() => { focusControl.requestFocus('txt1') }) .id('btn1') Button('收起键盘').onClick(() => { focusControl.requestFocus('btn1') }) TextInput({ controller: this.controller, text: this.inputValue })// 绑定自定义键盘 .customKeyboard(this.CustomKeyboardBuilder()) .margin(10) .border({ width: 1 }) .height('48vp') .id('txt1') TextInput({ placeholder: '没有关联自定义键盘' }) } }}
复制代码

4、HarmonyOS har 默认 router 所在的层级是主窗口还是跟随所在的 HSP router 层?

主窗口 A,子窗口 B,其中主窗口 A 存在 HSP 活检模块(隐私中间页面-》人脸 har 活检页面),子窗口 B 点击跳转 HSP 活检模块隐私中间页面(getUIContext().getRouter),活检模块隐私中间页面点击再跳转人脸 har,人脸 har 内部是否不需要 getRouter 方法进行跳转,人脸 har 默认 router 所在的层级是主窗口还是跟随所在的 HSP router 层?


根据 UIContext 说明,WindowStage/Window 可以通过 loadContent 接口加载页面并创建 UI 的实例,所以 UI 实例和窗口是一一关联的,也就是说想要通过 UIContext 获取 UI 实例的话,必须在当前调用界面能追溯到一个 UI 窗口。如果 UI 上下文不明确则无法调用。


HSP 页面路由跳转可参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/in-app-hsp-V5


HSP(Harmony Shared Package)是动态共享包,可以包含代码、C++库、资源和配置文件,通过 HSP 可以实现代码和资源的共享。HSP 不支持独立发布,而是跟随其宿主应用的 APP 包一起发布,与宿主应用同进程,具有相同的包名和生命周期。


HAR 页面路由跳转可参考(命名路由):https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-routing-V5页面路由指在应用程序中实现不同页面之间的跳转和数据传递。Router 模块通过不同的 url 地址,可以方便地进行页面路由,轻松地访问不同的页面。本文将从页面跳转、页面返回、页面返回前增加一个询问框和命名路由这几个方面,介绍如何通过 Router 模块实现页面路由。

5、HarmonyOS CustomDialogController 的创建方式问题?

showCaptch(){  let alertDialog: CustomDialogController = new CustomDialogController({    builder: DialogSliderCaptch()  })  alertDialog.open()}//放在一个page中,可以正常调用,但公开成如下那样的一个函数,就会报错,很容易复现
function showCaptch(){ let alertDialog: CustomDialogController = new CustomDialogController({ builder: DialogSliderCaptch() }) alertDialog.open()}
复制代码


在 ArkUI 中,CustomDialogController 是一个页面级别的组件,其生命周期是与页面绑定的。当 将 CustomDialogController 公开成一个函数时,实际上是将其从页面上下文中剥离出来,导致其无法正常使用。具体来说,CustomDialogController 在页面中的使用是通过页面的生命周期管理的,例如在页面加载完成后初始化,并在页面退出时销毁。如果将其公开成一个函数,则无法保证其在正确的生命周期阶段被初始化和销毁,从而导致不可预期的行为。此外,CustomDialogController 的一些属性和方法是与页面的生命周期相关的,例如 build 方法用于在页面中构建 UI 组件,而在函数中无法复用这个生命周期相关的逻辑。因此,将 CustomDialogController 公开成一个函数会导致其无法正常工作,因为它失去了与页面的绑定关系。


发布于: 刚刚阅读数: 4
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017-10-17 加入

Android、音视频、AI相关领域从业者。 欢迎加我微信wodekouwei拉您进InfoQ音视频沟通群 邮箱:qingkouwei@gmail.com

评论

发布
暂无评论
【每日学点HarmonyOS Next知识】防止重复点击、对话框收拾拦截、自定义键盘焦点、页面层级、自定义对话框创建_HarmonyOS_轻口味_InfoQ写作社区