构建ArkTS之@Builder装饰器:自定义构建函数

前面章节介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定,仅与使用方进行数据传递。ArkUI还提供了一种更轻量的UI元素复用机制@Builder,@Builder所装饰的函数遵循build()函数语法规则,开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

为了简化语言,我们将@Builder装饰的函数也称为“自定义构建函数”。

说明

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

装饰器使用说明

自定义组件内自定义构建函数

定义的语法:

@Builder MyBuilderFunction(){ ... }

使用方法:

this.MyBuilderFunction()
  • 允许在自定义组件内定义一个或多个@Builder方法,该方法被认为是该组件的私有、特殊类型的成员函数。
  • 自定义构建函数可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
  • 在自定义函数体中,this指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。建议通过this访问自定义组件的状态变量而不是参数传递。

全局自定义构建函数

定义的语法:

@Builder function MyGlobalBuilderFunction(){ ... }

使用方法:

MyGlobalBuilderFunction()
  • 全局的自定义构建函数可以被整个应用获取,不允许使用this和bind方法。
  • 如果不涉及组件状态变化,建议使用全局的自定义构建方法。

参数传递规则

自定义构建函数的参数传递有按值传递按引用传递两种,均需遵守以下规则:

  • 参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。
  • 在自定义构建函数内部,不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link
  • @Builder内UI语法遵循UI语法规则
  • 只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。

按引用传递参数

按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。

overBuilder( $$ : { paramA1: string, paramB1 : string } );
@Builder function overBuilder($$: { paramA1: string }) {
  Row() {
    Text(`UseStateVarByReference: ${$$.paramA1} `)
  }
}
@Entry
@Component
struct Parent {
  @State label: string = 'Hello';
  build() {
    Column() {
      // 在Parent组件中调用overBuilder的时候,将this.label引用传递给overBuilder
      overBuilder({ paramA1: this.label })
      Button('Click me').onClick(() => {
        // 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
        this.label = 'ArkUI';
      })
    }
  }
}

按值传递参数

调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递

@Builder function overBuilder(paramA1: string) {
  Row() {
    Text(`UseStateVarByValue: ${paramA1} `)
  }
}
@Entry
@Component
struct Parent {
  @State label: string = 'Hello';
  build() {
    Column() {
      overBuilder(this.label)
    }
  }
}

相关推荐

  1. 构建ArkTS@Builder装饰定义构建函数

    2024-04-09 14:02:04       33 阅读
  2. 鸿蒙定义组件内定义构建函数

    2024-04-09 14:02:04       69 阅读
  3. HarmonyOS@Builder装饰

    2024-04-09 14:02:04       71 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 14:02:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 14:02:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 14:02:04       82 阅读
  4. Python语言-面向对象

    2024-04-09 14:02:04       91 阅读

热门阅读

  1. 【牛客SQL快速入门】SQL基础(一)

    2024-04-09 14:02:04       35 阅读
  2. 出海业务的网络安全挑战

    2024-04-09 14:02:04       39 阅读
  3. 面试题:React的真实DOM和虚拟DOM的区别

    2024-04-09 14:02:04       36 阅读
  4. 从零开始构建网络爬虫:ScrapeKit库详解

    2024-04-09 14:02:04       38 阅读
  5. Vue 3中toRaw和markRaw的使用

    2024-04-09 14:02:04       32 阅读
  6. 目录模板-深度学习pytorch实战

    2024-04-09 14:02:04       32 阅读
  7. Ubuntu 16.04版本上安装make 3.8.1

    2024-04-09 14:02:04       40 阅读
  8. CentOS 7中常用的网络与用户相关命令详解

    2024-04-09 14:02:04       32 阅读
  9. 【Python小游戏】扫雷

    2024-04-09 14:02:04       34 阅读
  10. 【LeetCode】热题100:LRU缓存

    2024-04-09 14:02:04       29 阅读
  11. make[2]: texi2dvi: Command not found

    2024-04-09 14:02:04       31 阅读
  12. 5.117 BCC工具之xfsdist.py解读

    2024-04-09 14:02:04       34 阅读
  13. 第 9 场 小白入门赛 -- 蓝桥杯

    2024-04-09 14:02:04       34 阅读