HarmonyOS 应用开发之创建自定义组件,在线面试app

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Column() {
  Text('ArkUI message')
  HelloComponent(this.param);
  Divider()
  HelloComponent(this.param);
}

}
}


要完全理解上面的示例,需要了解自定义组件的以下概念定义,本文将在后面的小节中介绍:


* 自定义组件的基本结构
* 成员函数/变量
* 自定义组件的参数规定
* build()函数
* 自定义组件通用样式


### 自定义组件的基本结构


* struct:自定义组件基于struct实现,struct + 自定义组件名 + {…}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。



> 
> **说明:**  
>  自定义组件名、类名、函数名不能和系统组件名相同。
> 
> 
> 


* @Component:@Component装饰器仅能装饰struct关键字声明的数据结构。struct被@Component装饰后具备组件化的能力,需要实现build方法描述UI,一个struct只能被一个@Component装饰。@Component可以接受一个可选的bool类型参数。



> 
> **说明:**  
>  从API version 9开始,该装饰器支持在ArkTS卡片中使用。
> 
> 
> 


从API version 11开始,@Component可以接受一个可选的bool类型参数。



@Component
struct MyComponent {
}


#### freezeWhenInactive11+


组件冻结 选项。




| 名称 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| freezeWhenInactive | bool | 否 | 是否开启组件冻结。 |



@Component({ freezeWhenInactive: true })
struct MyComponent {
}


* build()函数:build()函数用于定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。

 

@Component
struct MyComponent {
build() {
}
}

* @Entry:@Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。@Entry可以接受一个可选的[LocalStorage](arkts-localstorage.md)的参数。



> 
> **说明:**  
>  从API version 9开始,该装饰器支持在ArkTS卡片中使用。
> 
> 
> 


从API version 10开始,@Entry可以接受一个可选的LocalStorage 的参数或者一个可选的 EntryOptions 参数。



@Entry
@Component
struct MyComponent {
}


#### EntryOptions10+


命名路由跳转选项。




| 名称 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| routeName | string | 否 | 表示作为命名路由页面的名字。 |
| storage | LocalStorage | 否 | 页面级的UI状态存储。 |
| useSharedStorage | boolean | 否 | 是否使用LocalStorage.getShared()接口返回的 LocalStorage 实例对象。 |



@Entry({ routeName : ‘myPage’ })
@Component
struct MyComponent {
}


* @Reusable:@Reusable装饰的自定义组件具备可复用能力



> 
> **说明:**  
>  从API version 10开始,该装饰器支持在ArkTS卡片中使用。
> 
> 
> 



@Reusable
@Component
struct MyComponent {
}


### 成员函数/变量


自定义组件除了必须要实现build()函数外,还可以实现其他成员函数,成员函数具有以下约束:


* 自定义组件的成员函数为私有的,且不建议声明成静态函数。


自定义组件可以包含成员变量,成员变量具有以下约束:


* 自定义组件的成员变量为私有的,且不建议声明成静态变量。
* 自定义组件的成员变量本地初始化有些是可选的,有些是必选的。具体是否需要本地初始化,是否需要从父组件通过参数传递初始化子组件的成员变量。


### 自定义组件的参数规定


从上文的示例中,我们已经了解到,可以在build方法里创建自定义组件,在创建自定义组件的过程中,根据装饰器的规则来初始化自定义组件的参数。



@Component
struct MyComponent {
private countDownFrom: number = 0;
private color: Color = Color.Blue;

build() {
}
}

@Entry
@Component
struct ParentComponent {
private someColor: Color = Color.Pink;

build() {
Column() {
// 创建MyComponent实例,并将创建MyComponent成员变量countDownFrom初始化为10,将成员变量color初始化为this.someColor
MyComponent({ countDownFrom: 10, color: this.someColor })
}
}
}


### build()函数


所有声明在build()函数的语言,我们统称为UI描述,UI描述需要遵循以下规则:


* @Entry装饰的自定义组件,其build()函数下的根节点唯一且必要,且必须为容器组件,其中ForEach禁止作为根节点。  
 @Component装饰的自定义组件,其build()函数下的根节点唯一且必要,可以为非容器组件,其中ForEach禁止作为根节点。

 

@Entry
@Component
struct MyComponent {
build() {
// 根节点唯一且必要,必须为容器组件
Row() {
ChildComponent()
}
}
}

@Component
struct ChildComponent {
build() {
// 根节点唯一且必要,可为非容器组件
Image(‘test.jpg’)
}
}

* 不允许声明本地变量,反例如下。

 

build() {
// 反例:不允许声明本地变量
let a: number = 1;
}

* 不允许在UI描述里直接使用console.info,但允许在方法或者函数里使用,反例如下。

 

build() {
// 反例:不允许console.info
console.info(‘print debug log’);
}

* 不允许创建本地的作用域,反例如下。

 

build() {
// 反例:不允许本地作用域
{

}
}

* 不允许调用没有用@Builder装饰的方法,允许系统组件的参数是TS方法的返回值。

 

@Component
struct ParentComponent {
doSomeCalculations() {
}

calcTextValue(): string {
return ‘Hello World’;
}

@Builder doSomeRender() {
Text(Hello World)
}

build() {
Column() {
// 反例:不能调用没有用@Builder装饰的方法
this.doSomeCalculations();
// 正例:可以调用
this.doSomeRender();
// 正例:参数可以为调用TS方法的返回值
Text(this.calcTextValue())
}
}
}

* 不允许使用switch语法,如果需要使用条件判断,请使用if。反例如下。

 

build() {
Column() {
// 反例:不允许使用switch语法
switch (expression) {
case 1:
Text(‘…’)
break;
case 2:
Image(‘…’)
break;
default:
Text(‘…’)
break;
}
}
}

* 不允许使用表达式,反例如下。

 

build() {
Column() {
// 反例:不允许使用表达式
(this.aVar > 10) ? Text(‘…’) : Image(‘…’)
}
}

* 不允许直接改变状态变量,反例如下。

 

@Component
struct CompA {
@State col1: Color = Color.Yellow;
@State col2: Color = Color.Green;
@State count: number = 1;
build() {
Column() {
// 应避免直接在Text组件内改变count的值
Text(${this.count++})
.width(50)
.height(50)
.fontColor(this.col1)
.onClick(() => {
this.col2 = Color.Red;
})
Button(“change col1”).onClick(() =>{
this.col1 = Color.Pink;
@State col2: Color = Color.Green;
@State count: number = 1;
build() {
Column() {
// 应避免直接在Text组件内改变count的值
Text(${this.count++})
.width(50)
.height(50)
.fontColor(this.col1)
.onClick(() => {
this.col2 = Color.Red;
})
Button(“change col1”).onClick(() =>{
this.col1 = Color.Pink;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值