HarmonyOS应用开发-ArkTS语言的装饰器之@BuilderParam

本文介绍了HarmonyOS中的BuilderParam装饰器,它用于为自定义组件添加特定功能,如点击跳转,并详细讲解了如何在自定义构建函数中使用和初始化@BuilderParam。同时,文章还涉及了全局自定义构建函数、尾随闭包等概念,并强调了鸿蒙开发的学习资源对于开发者的重要性。

前言

前面我们玩到了@ Builder 装饰器我们知道他是一个自定义构建函数,可以将重复使用的UI元素抽象成一个方法,在build方法里调用,那么本期我们要玩玩的是BuilderParam 顾名思义: builder 的参数,用作是啥? 这玩意有点麻烦说实话不好用......

用于自定义构建函数的时候在里面添加了一个自定义组件如果你需要实现点击跳转功能按早以前我们都是直接修改这个函数里面的组件那么导致所有引用这个函数的组件都会有点击跳转功能,为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,我们就可以在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。

该装饰器用于声明任意UI描述的一个元素,类似slot占位符。

使用

⚠️: @BuilderParam装饰的方法只能被自定义构建函数@Builder装饰来初始化

使用所属自定义组件的自定义构建函数或者全局的自定义构建函数,在本地初始化@BuilderParam,啥意思?操作看看

语法:

所属的自定义组件里面的函数

官方给到的一个语法

这里 void 后面跟着类似赋值操作 官方没有给出合理的解释, 我们继续跟着案例来

img

@Builder function GlobalBuilder0() {}
 
 @Component
 struct Child {
   @Builder doNothingBuilder() {};
   // 这里 void 后面跟着类似赋值操作 官方没有给出合理的解释
   @BuilderParam aBuilder0: () => void = this.doNothingBuilder;
   @BuilderParam aBuilder1: () => void = GlobalBuilder0;
   build(){}
 }

用父组件自定义构建函数初始化子组件@BuilderParam装饰的方法

使用子组件的 BuildeParam 传递参数的时候不能传递字符串、数值等类型只能传递 Builder 修饰的函数

img

// 乖儿
 @Component
 struct Son {
   @BuilderParam bp0: () => void;
 
   build() {
     Column() {
       // 直接调用使用
       this.bp0()
    }
  }
 }
 
 // 父亲组件
 @Entry
 @Component
 struct Father {
   @Builder componentBuilder() {
     Text(`我这里是父类里面的组件`)
  }
 
   build() {
     Column() {
       Son({bp0: this.componentBuilder})
    }
  }
 }

效果展示

img

this指向

这个时候虽然是可以用到父

### ArkTS 装饰器列表及其使用方法 #### 1. 基本概述 ArkTS 是一种专为 HarmonyOS 设计的现代化编程语言,继承了许多现代脚本语言的特点,并针对 UI 开发进行了优化。装饰器(Decorator)是 ArkTS 中的重要特性之一,用于增强类、结构体或方法的功能[^1]。 以下是常见的 ArkTS 装饰器分类及具体用法: --- #### 2. 页面与组件相关装饰器 ##### 2.1 `@Component` - **用途**: 将一个结构体标记为可重用的 UI 组件。 - **特点**: 结构体需实现 `build` 方法以描述 UI 渲染逻辑。 - **示例**: ```typescript @Component struct MyButton { build() { Button("Click Me").onClick(() => console.log("Clicked!")) } } ``` ##### 2.2 `@Entry` - **用途**: 标记某个组件为页面入口。 - **特点**: 加载此页面时会自动渲染该组件。 - **示例**: ```typescript @Entry @Component struct MainPage { build() { Column() { Text("Welcome to the Main Page!") }.width('100%').height('100%') } } ``` ##### 2.3 `@Preview` - **用途**: 支持 DevEco Studio 的预览功能。 - **特点**: 自定义组件可以通过此装饰器实现实时可视化调试。 - **示例**: ```typescript @Preview @Component struct PreviewableWidget { build() { Image($r("app.media.icon")).width(50).height(50) } } ``` ##### 2.4 `@CustomDialog` - **用途**: 创建自定义对话框组件。 - **特点**: 提供灵活的方式定制弹窗交互体验。 - **示例**: ```typescript @CustomDialog @Component struct ConfirmDialog { build() { Dialog({ content: "Are you sure?", buttons: [ { text: "Cancel", onClick: () => {} }, { text: "OK", onClick: () => {} } ] }) } } ``` --- #### 3. 数据绑定与状态管理装饰器 ##### 3.1 `@State` - **用途**: 定义局部状态变量。 - **特点**: 修改后会触发组件重新渲染。 - **示例**: ```typescript @Component struct Counter { @State count: number = 0; build() { Column() { Text(`Count: ${this.count}`) Button("+1").onClick(() => this.count++) } } } ``` ##### 3.2 `@Prop` - **用途**: 实现父组件向子组件传递单向数据流。 - **特点**: 子组件无法直接修改传入的数据。 - **示例**: ```typescript @Component struct Parent { build() { Child({ message: "Hello, child!" }) } } @Component struct Child { @Prop message: string = ""; build() { Text(this.message) } } ``` ##### 3.3 `@Link` - **用途**: 实现父子组件间的双向数据绑定。 - **特点**: 父组件和子组件的状态始终保持一致。 - **示例**: ```typescript @Component struct Parent { @State sharedValue: string = "Initial Value"; build() { Column() { Input().value(this.sharedValue).onChange((val) => this.sharedValue = val) Child({ linkedValue: this.sharedValue }) } } } @Component struct Child { @Link linkedValue: string = ""; build() { Text(this.linkedValue) } } ``` ##### 3.4 `@Provide` 和 `@Consume` - **用途**: 在多层嵌套组件间共享数据。 - **特点**: `@Provide` 提供数据,`@Consume` 接收数据。 - **示例**: ```typescript @Component struct GrandParent { @Provide data: string = "Shared Data"; build() { Parent() } } @Component struct Parent { build() { Child() } } @Component struct Child { @Consume data!: string; build() { Text(this.data) } } ``` --- #### 4. 类与对象相关装饰器 ##### 4.1 `@Observed` - **用途**: 监听类实例中的数据变化。 - **特点**: 所有被观察的数据变动都会通知视图更新。 - **示例**: ```typescript @Observed class User { name: string = "John Doe"; } @Component struct Profile { user = new User(); build() { Column() { Text(this.user.name) } } } ``` ##### 4.2 `@ObjectLink` - **用途**: 链接已由 `@Observed` 装饰的对象。 - **特点**: 同步多个组件内的相同对象状态。 - **示例**: ```typescript @Observed class SharedData { value: string = "Default"; } @Component struct ComponentA { @ObjectLink sharedData!: SharedData; build() { TextInput().text(this.sharedData.value).onChange((v) => this.sharedData.value = v) } } @Component struct ComponentB { @ObjectLink sharedData!: SharedData; build() { Text(this.sharedData.value) } } ``` --- #### 5. 构建与扩展相关装饰器 ##### 5.1 `@Builder` - **用途**: 动态生成复杂布局内容。 - **特点**: 提高代码复用性和灵活性。 - **示例**: ```typescript @Component struct Example { @Builder BuilderMethod() { ForEach([1, 2, 3], (item) => ( Text(item.toString()) )) } build() { Column() { this.BuilderMethod() } } } ``` ##### 5.2 `@BuilderParam` - **用途**: 指定指向 `@Builder` 方法的参数。 - **特点**: 方便初始化自定义组件时设置动态行为。 - **示例**: ```typescript @Component struct Parent { @Builder CustomContent() { Text("Dynamic Content") } build() { Child({ builder: this.CustomContent }) } } @Component struct Child { @BuilderParam builder!: () => void; build() { Column() { this.builder() } } } ``` ##### 5.3 `@Extend` - **用途**: 扩展内置组件的行为或样式。 - **特点**: 提升组件的可配置能力。 - **示例**: ```typescript @Extend(Button) addStyle(style: Style): void { style.backgroundColor = Color.Blue; } ``` ##### 5.4 `@Watch` - **用途**: 监听特定状态的变化并执行回调操作。 - **特点**: 及时响应数据更改事件。 - **示例**: ```typescript @Component struct WatchExample { @State counter: number = 0; @Watch(counter) onCounterChange(newVal: number, oldVal: number) { console.log(`Changed from ${oldVal} to ${newVal}`); } build() { Button("Increment").onClick(() => this.counter++) } } ``` --- ### 总结 以上列举了 ArkTS 中主要的装饰器类型及其典型应用场景。这些装饰器极大地增强了开发者对组件化架构的支持以及高效的状态管理和数据流动控制[^2][^3].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值