ArkTs 语法学习 ---- 组件相关装饰器

装饰器

特殊装饰器

组件相关装饰器

  • @Entry
  • @Component
  • @Builder
  • @BuilderParam
  • @CustomDialog
@Entry 页面入口装饰器
@Entry说明
装饰器参数
装饰对象自定义组件
特性被装饰的自定义组件作为页面入口,
单个UI页面中,最多可以使用@Entry装饰一个自定义组件
@Entry可以接受一个可选的LocalStorage的参数
@Component 自定义组件装饰器

自定义组件的基本结构:

  • struct:自定义组件基于struct实现,struct + 自定义组件名 + {…}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。
  • 自定义组件名、类名、函数名不能和系统组件名相同。
@Component说明
装饰器参数
装饰对象仅能装饰struct关键字声明的数据结构。
特性struct被@Component装饰后具备组件化的能力,
需要实现build方法描述UI,
一个struct只能被一个@Component装饰。
@Builder
@Builder说明
装饰器参数
装饰对象函数,被装饰的函数被称为自定义构造函数
语法规则@Builder所装饰的函数遵循build()函数语法规则,
开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。
创建,使用语法自定义组件内:创建@Builder MyBuilderFunction(){ … },使用this.MyBuilderFunction()
全局:创建@Builder function MyGlobalBuilderFunction(){ … },使用MyGlobalBuilderFunction()
自定义组件内可以定义一个或多个,
该方法被认为是该组件的私有、特殊类型的成员函数。
可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
全局可以被整个应用获取,不允许使用this和bind方法。
如果不涉及组件状态变化,建议使用全局的自定义构建方法。
this指向this指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。
建议通过this访问自定义组件的状态变量而不是参数传递。
参数传递方式按值传递和按引用传递
参数传递规则参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。
不允许改变参数值。如果需要改变参数值,且同步回调用点,建议使用@Link。
@Builder内UI语法遵循UI语法规则
只有传入一个参数,且参数需要直接传入对象字面量才会按引用传递该参数,其余传递方式均为按值传递。
  • 按引用传递参数
    参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。
ABuilder( $$ : { paramA1: string, paramB1 : string } );
@Builder function ABuilder($$: { paramA1: string }) {
  Row() {
    Text(`UseStateVarByReference: ${$$.paramA1} `)
  }
}
@Entry
@Component
struct Parent {
  @State label: string = 'Hello';
  build() {
    Column() {
      // 在Parent组件中调用ABuilder的时候,将this.label引用传递给ABuilder
      ABuilder({ paramA1: this.label })
      Button('Click me').onClick(() => {
        // 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
        this.label = 'ArkUI';
      })
    }
  }
}
  • 按值传递参数
    调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递。
@Builder function ABuilder(paramA1: string) {
  Row() {
    Text(`UseStateVarByValue: ${paramA1} `)
  }
}
@Entry
@Component
struct Parent {
  @State label: string = 'Hello';
  build() {
    Column() {
      ABuilder(this.label)
    }
  }
}
@BuilderParam 装饰指向@Builder方法的变量
@BuilderParam说明
装饰器参数
值类型@Builder 装饰的函数
即 @BuilderParam装饰的方法只能被自定义构建函数(@Builder装饰的方法)初始化。
this指向this指向 绘制时的父组件
  • @BuilderParam装饰的方法可以是有参数和无参数的两种形式,需与指向的@Builder方法类型匹配。@BuilderParam装饰的方法类型需要和@Builder方法类型一致。
  • 尾随闭包初始化组件
    自定义组件内有且仅有一个使用@BuilderParam装饰的属性才能使用
    在初始化自定义组件时,组件后紧跟一个大括号“{}”形成尾随闭包场景。
    可以将尾随闭包内的内容看做@Builder装饰的函数传给@BuilderParam
@Component
struct CustomContainer {
  @Prop header: string;
  @BuilderParam closer: () => void

  build() {
    Column() {
      Text(this.header)
        .fontSize(30)
      this.closer()
    }
  }
}

@Builder function specificParam(label1: string, label2: string) {
  Column() {
    Text(label1)
      .fontSize(30)
    Text(label2)
      .fontSize(30)
  }
}

@Entry
@Component
struct CustomContainerUser {
  @State text: string = 'header';

  build() {
    Column() {
      // 创建CustomContainer,在创建CustomContainer时,通过其后紧跟一个大括号“{}”形成尾随闭包
      // 作为传递给子组件CustomContainer @BuilderParam closer: () => void的参数
      CustomContainer({ header: this.text }) {
        Column() {
          specificParam('testA', 'testB')
        }.backgroundColor(Color.Yellow)
        .onClick(() => {
          this.text = 'changeHeader';
        })
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值