遥遥领先! HarmonyOS 自定义组件的结构、函数、变量、参数规定,这篇太干了我要渴死了!!!

2023-12-04 01:49:21 浏览数 (1)

前言

上一篇文章我们介绍了声明式UI描述和自定义组件的基本用法,现在我们系统的看看自定义组件的结构、成员函数、变量等.在 《遥遥领先,HaemonyOS的ArkTS应用入门实操》文章里面我们讲解了 ArkTS 的基本代码组成,这里我们看看具体的组件结构.

bannerbanner

组件的基本结构

image.pngimage.png

Struct 基本结构

自定义组件基于struct实现

struct 自定义组件名 {...}的组合构成自定义组件

  • 不能有继承关系
  • 对于struct的实例化 可以省略new
image.pngimage.png

Custom components cannot extend or implement other classes and interfaces. <etsLint> 自定义组件无法扩展或实现其他类和接口。<etsLint> ⚠️ 自定义组件名、类名、函数名不能和系统组件名相同

Component 基本结构

@Component装饰器 仅能装饰struct关键字声明 的数据结构image.pngimage.png

A function or a method can only be decorated by one of the 'Extend, Builder and Styles'. <etsLint> 函数或方法只能由“扩展、生成器和样式”之一修饰。<etsLint>

  • struct被@Component装饰后具备组件化的能力
  • 需要实现build方法描述UI
image.pngimage.png

This custom component must have a 'build' function. <etsLint> 此自定义组件必须具有“build”功能。<etsLint>

  • 一个struct只能被一个@Component装饰
image.pngimage.png

Duplicate decorators for struct are not allowed. <etsLint> 不允许使用重复的 struct 装饰器。<etsLint>

Build 基本结构

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

image.pngimage.png

This custom component must have a 'build' function. <etsLint> 此自定义组件必须具有“build”功能。<etsLint>

Build() 函数

所有声明在build()函数的语言,我们统称为UI描述.

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

和 Vue2 一样需要根节点只能一个

  • 不允许声明本地变量
image.pngimage.png
  • 不允许在UI描述里直接使用console.info,但允许在方法或者函数里使用
image.pngimage.png
  • 不允许创建本地的作用域
image.pngimage.png
  • 不允许调用没有用@Builder装饰的方法,允许系统组件的参数是TS方法的返回值
image.pngimage.png
  • 不允许switch语法,如果需要使用条件判断那么就只能用 IF 来判断了
image.pngimage.png
  • 不允许使用表达式
image.pngimage.png

Entry 基本结构

@Entry装饰的自定义组件将作为UI页面的入口

在单个UI页面中,最多可以使用@Entry装饰一个自定义组件,将相当于 Java 当中的 Main 函数

image.pngimage.png

Duplicate decorators for struct are not allowed. <etsLint> 不允许使用重复的 struct 装饰器。<etsLint>

函数/变量

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

  • 不支持静态函数。
  • 成员函数的访问是私有的。

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

  • 不支持静态成员变量。
  • 所有成员变量都是私有的,变量的访问规则与成员函数的访问规则相同。
  • 自定义组件的成员变量本地初始化有些是可选的,有些是必选的。具体是否需要本地初始化,是否 需要从父组件通过参数传递初始化子组件的成员变量

组件的参数规定

在上面的 Build函数当中我们讲到了可以在 build 当中使用方法或者使用 @Builder 来修饰的函数里创建自定义组件

我们在创建自定义组件的过程中,根据装饰器的规则来初始化自定义组件的参数

image.pngimage.png
代码语言:go复制
// Entry 标记当前组件是入口组件,比如Java当中的Main (标记后就变成了一个独立的页面)
@Entry
// Component 装饰器: 需要使用装饰器来标志(相当于 Java 里面的 Bean) 用来修饰类结构、方法、变量
@Component
// struct 结构体 就是一个自定义的组件,和VUE一样哪里都可以用
struct Order {
    // 定义变量
    // @State 变量名称: 变量类型(TS语法不知道的可以去学学基础) = 对应变量类型的数据
    @State message: string = 'Hello World'
    private flag: string = '父组件私有'

    // 构建组件为页面元素
    build() {
        // 根节点唯一且必要,必须为容器组件
        Row() {
            ParentComponent({ countDownFrom: 36, flag: this.flag })
            .onClick(() => {
                console.info('方法或者函数里面允许!');
            })
        }
    }
}

// 子组件
@Component
struct ParentComponent {
    private countDownFrom: number = 0;
    private flag: string = '子组件私有'

    build() {
        Column() {
            Text(`${this.countDownFrom}`).fontSize(30)
            Divider()
            Text(`${this.flag}`).fontSize(30)
        }
    }
}

ok 自定义组件的知识点差不多搞定,还剩下一些装饰器的玩法.

最后

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

本期结束咱们下次再见

0 人点赞