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)
    }
  }
}
相关推荐
Georgewu8 小时前
【HarmonyOS 6】 The target can not be empty. check the build.profile,json5 file of
harmonyos
Georgewu8 小时前
【HarmonyOS 6】Install Failed: error: failed to install bundle.code:9568322
harmonyos
爱笑的眼睛1110 小时前
HarmonyOS 应用开发新范式:深入剖析 Stage 模型与 ArkTS 状态管理
华为·harmonyos
爱笑的眼睛1112 小时前
深入浅出 HarmonyOS ArkUI 3.0:基于声明式开发范式与高级状态管理构建高性能应用
华为·harmonyos
电手13 小时前
时隔4年麒麟重新登场!华为这8.8英寸新「手机」给我看麻了
华为·智能手机
程序员潘Sir15 小时前
鸿蒙应用开发从入门到实战(一):鸿蒙应用开发概述
harmonyos
敲代码的鱼哇18 小时前
跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
android·ios·harmonyos
在下历飞雨19 小时前
Kuikly基础之状态管理与数据绑定:让“孤寡”计数器动起来
ios·harmonyos
在下历飞雨19 小时前
Kuikly基础之Kuikly DSL基础组件实战:构建青蛙主界面
ios·harmonyos
HarmonyOS小助手20 小时前
HEIF:更高质量、更小体积,开启 HarmonyOS 图像新体验
harmonyos·鸿蒙·鸿蒙生态