leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • 基础入门

    • 项目简介
    • ArkTS基础之自定义组件
    • ArkTS基础之页面与自定义组件生命周期
    • Column&Row组件的使用
    • ohpm安装及配置
  • HarmonyOS
  • 基础入门
心欲无痕
2023-09-25

ArkTS基础之自定义组件

官方文档 (opens new window)

在 ArkTS 中,我们可以自定义组件,例如:

// 定义名为TitleComponent的自定义组件
@Component
struct TitleComponent {
	...
	build () {}
}

// 定义名为RankPage的自定义组件,在其中使用TitleComponent组件
@Entry
@Component
struct RankPage {
	@State myText: string = 'hello harmonyOs';
	...
	build () {
		Column () {
			TitleComponent()
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • @Component 装饰的 struct 表示该结构体具有组件化能力,能够成为一个独立的组件
  • @Entry 表示该自定义组件为入口组件,即页面的根节点,一个页面有且仅能有一个 @Entry。只有被 @Entry 装饰的组件才可以调用页面的生命周期。
  • @State 表示组件中的状态变量,状态变量变化会触发 UI 刷新
  • build () 函数:用于定义自定义组件的声明式 UI 描述,自定义组件必须定义 build () 函数。
  • @Prop:与 @State 有相同的语义,但初始化方式不同,@Porp 装饰的变量必须使用其父组件提供的 @State 变量进行初始化,允许组件内部修改 @Prop 变量,但更改不会通知给父组件,即 @Prop 属于单向数据绑定。
  • @Link:使用 @Link 装饰的变量可以和父组件的 @State 变量建立双向数据绑定,需要注意的是:@Link 变量不能在组件内部进行初始化。
  • @Builder:用于定义组件的声明式 UI 描述,在一个自定义组件内快速生成多个布局内容。
  • @Watch:监听状态变化

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

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

@Component
struct ChildComponent {
  build() {
    // 根节点唯一且必要,可为非容器组件
    Image('test.jpg')
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 不允许声明本地变量,反例:
build() {
  // 反例:不允许声明本地变量
  let a: number = 1;
}
1
2
3
4
  • 不允许在 UI 描述里直接使用 console.info,但允许在方法或函数里使用,反例:
build() {
  // 反例:不允许console.info
  console.info('print debug log');
}
1
2
3
4
  • 不允许创建本地的作用于,反例:
build() {
  // 反例:不允许本地作用域
  {
    ...
  }
}
1
2
3
4
5
6
  • 不允许调用除了被 @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())
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • 不允许 switch 语法,如果需要使用条件判断,请使用 if。反例:
build() {
  Column() {
    // 反例:不允许使用switch语法
    switch (expression) {
      case 1:
        Text('...')
        break;
      case 2:
        Image('...')
        break;
      default:
        Text('...')
        break;
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 不允许使用表达式,反例:
build() {
  Column() {
    // 反例:不允许使用表达式
    (this.aVar > 10) ? Text('...') : Image('...')
  }
}
1
2
3
4
5
6
编辑 (opens new window)
上次更新: 7/1/2024, 4:56:33 PM
项目简介
ArkTS基础之页面与自定义组件生命周期

← 项目简介 ArkTS基础之页面与自定义组件生命周期→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式