【每日学点HarmonyOS Next知识】自定义对象传参、页面生命周期、自定义弹窗、路由打开对话框,网络图片

ops/2025/3/14 15:31:35/
1、HarmonyOS 如何方便的自定义对象传参数?

如何方便的自定义对象传参数

在ArkTS语法中对于字典是有约束的,使用map只能通过set的方式在ArkTS中,对象的属性名不能为数字或字符串。例外:ArkTS支持属性名为字符串字面量和枚举中的字符串值。通过属性名访问类的属性,通过数值索引访问数组元素。ArkTS中:

class X {public name: string = ''
}
let x: X = { name: 'x' };
console.log(x.name);let y = ['a', 'b', 'c'];
console.log(y[2]);

在需要通过非标识符(即不同类型的key)获取数据的场景中,使用Map<Object, some_type>。

let z = new Map<Object, string>();
z.set('name', '1');
z.set(2, '2');
console.log(z.get('name'));
console.log(z.get(2));enum Test {A = 'aaa',B = 'bbb'
}let obj: Record<string, number> = {[Test.A]: 1,   // 枚举中的字符串值[Test.B]: 2,   // 枚举中的字符串值['value']: 3   // 字符串字面量
}
2、HarmonyOS 除了route可以获取到page相关信息,HarmonyOS页面中有title的概念么?

应用的UI页面可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry,只有被@Entry装饰的组件才可以调用页面的生命周期,所以说并没有title这个概念。参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-page-custom-components-lifecycle-V5

在开始之前,我们先明确自定义组件和页面的关系:

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。

  • 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面生命周期,即被@Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮时触发。

组件生命周期,即一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • onDidBuild:组件build()函数执行完成之后回调该接口,开发者可以在这个阶段进行埋点数据上报等不影响实际UI的功能。不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
  • aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。

生命周期流程如下图所示,下图展示的是被@Entry装饰的组件(页面)生命周期。
在这里插入图片描述

3、HarmonyOS 弹窗的样式能否支持自定义?

需要实现一个下拉弹窗的功能,弹窗在宽度上需要为屏幕的宽度。自定义弹窗、popup、菜单的弹窗宽度最大化,距离屏幕也会有一定间距。弹窗的样式是否可以自定义?

自定义弹窗 (CustomDialog)中的customStyle属性置为true时,弹窗宽度可以达到最大化示例如下:

// xxx.ets
import { ResizeDirection } from '@kit.TestKit'@CustomDialog
struct CustomDialogExampleTwo {controllerTwo?: CustomDialogControllerbuild() {Column() {Text('我是第二个弹窗').fontSize(30).height(100)Button('点我关闭第二个弹窗').onClick(() => {if (this.controllerTwo != undefined) {this.controllerTwo.close()}}).margin(20)}}
}
@CustomDialog
struct CustomDialogExample {@Link textValue: string@Link inputValue: stringdialogControllerTwo: CustomDialogController | null = new CustomDialogController({builder: CustomDialogExampleTwo(),alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -25 } })controller?: CustomDialogController// 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在所有controller的后面cancel: () => void = () => {}confirm: () => void = () => {}build() {Column() {Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%').onChange((value: string) => {this.textValue = value})Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })Flex({ justifyContent: FlexAlign.SpaceAround }) {Button('cancel').onClick(() => {if (this.controller != undefined) {this.controller.close()this.cancel()}}).backgroundColor(0xffffff).fontColor(Color.Black)Button('confirm').onClick(() => {if (this.controller != undefined) {this.inputValue = this.textValuethis.controller.close()this.confirm()}}).backgroundColor(0xffffff).fontColor(Color.Red)}.margin({ bottom: 10 })Button('点我打开第二个弹窗').onClick(() => {if (this.dialogControllerTwo != null) {this.dialogControllerTwo.open()}}).margin(20)}.borderRadius(10).backgroundColor(0x300aff)// 如果需要使用border属性或cornerRadius属性,请和borderRadius属性一起使用。}
}
@Entry
@Component
struct CustomDialogUser {@State textValue: string = ''@State inputValue: string = 'click me'dialogController: CustomDialogController | null = new CustomDialogController({builder: CustomDialogExample({cancel: ()=> { this.onCancel() },confirm: ()=> { this.onAccept() },textValue: $textValue,inputValue: $inputValue}),cancel: this.exitApp,autoCancel: true,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -20 },gridCount: 4,customStyle: true,cornerRadius: 10,})// 在自定义组件即将析构销毁时将dialogControlle置空aboutToDisappear() {this.dialogController = null // 将dialogController置空}onCancel() {console.info('Callback when the first button is clicked')}onAccept() {console.info('Callback when the second button is clicked')}exitApp() {console.info('Click the callback in the blank area')}build() {Column() {Button(this.inputValue).onClick(() => {if (this.dialogController != null) {this.dialogController.open()}}).backgroundColor(0x317aff)}.width('100%').margin({ top: 5 })}
}
4、HarmonyOS CustomDialog通过路由打开页面出现的问题?

在page1中打开一个dialog,然后dialog里有个按钮跳转到page2,但是很奇怪page2不是覆盖上来,而是插入在page1跟dialog之间,dialog在最顶层

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-navigation-V5

5、HarmonyOS 如何访问一个在线的图片?

Image组件可以加在网络在线图片,需要需要申请权限ohos.permission.INTERNET

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/image-V5


http://www.ppmy.cn/ops/165696.html

相关文章

AI智能导航站HTML5自适应源码帝国cms7.5模板

源码名称&#xff1a;AI导航站HTML5自适应源码帝国cms7.5模板 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql var code "4d33ef8e-9e38-43b9-b37b-38f75944ecc9" 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff0…

【Godot4.0】贝塞尔曲线在游戏中的实际应用

概述 之前研究贝塞尔曲线绘制&#xff0c;完全是以绘图函数&#xff0c;以及实现节点连接为思考。并没有实际考虑贝塞尔曲线在游戏中的应用。今日偶然看到悦千简一年多前发的一个用贝塞尔曲线实现追踪弹或箭矢效果&#xff0c;还有玩物不丧志的老李杀戮尖塔系列中的卡牌动态箭…

电子电气架构 ---常见车规MCU安全启动方案

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Linux中grep、sed和awk常见用法总结

1.概述 Linux系统下&#xff0c;grep、sed和awk三个命令是最常用的、非常强大的文本处理工具&#xff0c;可以用于搜索、替换、过滤、排序等多种操作&#xff0c;掌握这三种工具的用法&#xff0c;可以大大提高我们在Linux下处理文本的效率。 2.grep命令 grep是一种非常常见…

嵌入式学习L6网络编程D3TCP

TCP编程 写代码 第一步socket 绑定 先填充 点分十进制转换成32位整数 client 然后就连接成功了就可以读写数据了 client #include "net.h"int main (void) {int fd -1;struct sockaddr_in sin;/* 1. 创建socket fd */if ((fd socket (AF_INET, SOCK_S…

2025-3-12 leetcode刷题情况(贪心算法--区间问题)

一、452.用最少数量的箭引爆气球 1.题目描述 2.代码 3.思路 使用 Arrays.sort 方法对 points 数组按照气球的起始坐标进行排序。这里使用 Integer.compare(a[0], b[0]) 作为比较器&#xff0c;确保气球按起始坐标从小到大排列。将箭的数量 count 初始化为 1&#xff0c;因为至…

从零开始的python学习(五)P75+P76+P77+P78+P79+P80

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

TypeScript泛型深度剖析:对比JavaScript的灵活与严谨

一、类型系统的进化之路 在JavaScript的灵活性与TypeScript的严谨性之间&#xff0c;泛型&#xff08;Generics&#xff09;架起了一座精妙的桥梁。当我们从JavaScript迁移到TypeScript时&#xff0c;经常会遇到这样的困境&#xff1a;如何在不丧失灵活性的前提下保证类型安全…