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';
        })
      }
    }
  }
}

最近更新

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

    2024-01-26 18:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-26 18:10:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-26 18:10:01       82 阅读
  4. Python语言-面向对象

    2024-01-26 18:10:01       91 阅读

热门阅读

  1. SQL 系列教程(五)

    2024-01-26 18:10:01       40 阅读
  2. ==与equals

    2024-01-26 18:10:01       51 阅读
  3. hashmap中的put方法存放数据源码解析

    2024-01-26 18:10:01       51 阅读
  4. 4.Doris数据导入导出

    2024-01-26 18:10:01       116 阅读
  5. 设计模式-三大工厂模式

    2024-01-26 18:10:01       53 阅读
  6. C++笔记(五)

    2024-01-26 18:10:01       50 阅读
  7. 初级通信工程师-现代通信技术

    2024-01-26 18:10:01       46 阅读
  8. 运动员最佳匹配问题

    2024-01-26 18:10:01       49 阅读
  9. npm---npm ci命令使用详解

    2024-01-26 18:10:01       50 阅读