ArkTs装饰器之@Builder

@Builder装饰器

概念

  • 自定义构建函数
  • ArkUI提供了一种轻量的UI元素复用机制@Builder,其内部UI结构固定,仅与使用方进行数据传递
  • @Builder所装饰的函数遵循build( ) 函数语法规则
  • 开发者可以将重复使用的UI元素抽象成一个方法,在build中进行调用
  • 我们将@Builder装饰的函数也成为"自定义构建函数"

使用说明

私有自定义构建函数

  1. 允许在自定义组件内定义一个或者多个@Builder方法,该方法被认为是该组件私有,特殊类型的成员函数
  2. 私有自定义构建函数(@Builder)可以在所属组件的build方法和其他自定义构建函数(@Builder)中调用
  3. 不允许在组件外部调用
  4. 在自定义函数体中,this 指向当前所属组件,组件的状态变量可以在自定义构建函数内访问
  5. 建议通过this访问自定义组件的状态变量,不是通过参数传递
typescript 复制代码
@Entry
@Component

struct test_page01{

  @State message:string = 'nihao'
  @Builder
  text_dis(){
    Column(){
      Text(this.message)
        .fontSize(20)
    }
  }

  build() {
    Column({space:20}){
      this.text_dis()
      Button('点击改变')
        .onClick(()=>{
          this.message = '你好'
        })
    }
    .height('100%')
    .width('100%')
  }
}

全局自定义函数

  1. 全局的自定义构建函数可以被整个应用获取(前提是要export
  2. 不允许使用this和bind(改变指向)方法
  3. 如果不涉及组件状态变量,建议使用全局的自定义构建方法

参数传递的规则:

  1. 自定义构建函数的参数传递有

    • 按值传递
    • 按引用传递(如果传递的参数为状态变量,可以支持监听UI的刷新)
  2. 均遵循以下规则:

    • 参数的类型必须与参数声明的类型一致
    • 在@Builder修饰的函数内部,不允许修改参数值
    • @Builder内UI语法遵循build( ) UI语法规则
    • 只有传入一个参数,且参数为直接传入对象字面量,才能按引用传递该参数,其余的方式均按值传递
  3. 按引用传递参数

    • 如果在@Builder方法中调用自定义组件,ArkUI提供
      • $$作为引用传递参数的范式
      • 如果使用自定义的参数名传递给自定义组件,如果自定义组件使用@Link接受,会报错
  4. 按值传递参数

    • 调用@Builder装饰的函数默认按值传递

      • 当传递的参数为状态变量时,状态变量的改变,不会引起@builder方法内的UI刷新

      • 当使用状态变量的时候,推荐使用引用变量传递

typescript 复制代码
// 引用传递第一种写法
class temp_class01{
  param:string = ''
  param1:string = ''
}

// 引用传递第二中写法
class temp_class02{
  param:string = ''
  param1:string = ''
}


@Entry
@Component
struct temp_page103{
  @State param_build:string  ='123'
  @State param_build01:string  ='456'

  build() {
    Column({space:50}){
    //   引用传递第一种写法
    //   对象中有几个字面量,就必须传递几个
      Builder_function({param:this.param_build,param1:this.param_build01})

    //   引用传递第二种写法
      Builder_function01({param:this.param_build,param1:this.param_build01})

      Button(`点击改变`)
        .onClick(()=>{
          this.param_build = '111'
          this.param_build01 = '222'
        })
    }
    .height('100%')
    .width('100%')
  }
}

@Builder
function Builder_function(temp_param:temp_class01){
  Column(){
    Text(temp_param.param)
      .fontSize(20)
    Text(temp_param.param1)
      .fontSize(20)
  }
}

@Builder
function Builder_function01($$:temp_class02){
  Column(){
    Text(`${$$.param}`)
      .fontSize(20)
      .fontColor(Color.Red)
    Text(`${$$.param1}`)
      .fontSize(20)
      .fontColor(Color.Red)

  //   自定义组件
temp_component({str:$$.param})
  }

}

@Component
struct temp_component{
  // 接收传递过来的$$
  // 使用@Link装饰的状态变量接收,回报错
  @Prop str:string = ''
  build() {
    Column(){

      Text(this.str)
        .fontSize(20)
        .fontColor(Color.Yellow)
    }
  }
}
相关推荐
Georgewu5 小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
harmonyos
libo_20257 小时前
HarmonyOS5 元宇宙3D原子化服务开发实践
harmonyos
半路下车7 小时前
【Harmony OS 5】DevEco Testing重塑教育质量
harmonyos·arkts
90后的晨仔7 小时前
解析鸿蒙 ArkTS 中的 Union 类型与 TypeAliases类型
前端·harmonyos
风浅月明7 小时前
[Harmony]颜色初始化
harmonyos·color
风浅月明8 小时前
[Harmony]网络状态监听
harmonyos·网络状态
半路下车8 小时前
【Harmony OS 5】DevEco Testing在教育领域的应用与实践
harmonyos·产品
simple丶8 小时前
【HarmonyOS Relational Database】鸿蒙关系型数据库
harmonyos·arkts·arkui
哼唧唧_9 小时前
使用 React Native 开发鸿蒙(HarmonyOS)运动健康类应用的系统化准备工作
react native·react.js·harmonyos·harmony os5·运动健康
三掌柜6669 小时前
HarmonyOS开发:显示图片功能详解
华为·harmonyos