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)
    }
  }
}
相关推荐
xmweisi1 小时前
【华为】查看防火墙会话表命令
服务器·网络·华为
飞翔沫沫情1 小时前
华为 VRP 系统简介&配置SSH,TELNET远程登录
运维·华为·hcip·数通
TMT星球1 小时前
科大讯飞星火X1全面升级,联合华为推出星火一体机系列新品
华为
谢宁华为战略管理研发管理1 小时前
《向华为学习:BEM战略解码》课程大纲
学习·华为
zhongzx2 小时前
【Harmony OS Next】封装时间选择按钮
harmonyos
小han的日常3 小时前
UI自动化框架介绍
运维·ui·自动化
AirDroid_cn5 小时前
华为手机投屏到Windows电脑,不是华为电脑怎么投屏?
华为·智能手机·电脑·手机投屏·无线投屏·手机投屏电脑
前端晚间课6 小时前
鸿蒙原生应用开发入门与实践
harmonyos
程序猿阿伟6 小时前
《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》
华为·harmonyos