ArkTS - @Builder自定义构建函数

本文介绍了如何在ArkUI中使用@Builder装饰器将组件样式抽离到公共函数,区分了引用传递和值传递参数的用法,并强调了状态变量对UI刷新的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个@Builder作用就是可以把组件样式抽离出来,写成公共组件,下边记录下全局自定义构建函数用法及注意的地方。

官方文档:开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。

一、用法

下边代码,我在CommonBtn.ets文件中定义了两个函数,函数里边定义了按钮样式,这两个函数必须要用@Builder装饰器装饰(官方规定)。
一个是按引用传递的参数(引用传递参数必须写两个$符号,$符号的值就是:{ 参数名:参数类型})
另一个是按值传递的参数,引用和值传递区别下边记录,最后把函数导出。

// CommonBtn.ets
// 引用传递
@Builder
export function Btn1($$: {btnName: string}){
  Row() {
    Button($$.btnName).width(200).padding({left: 20, right: 20})
  }.justifyContent(FlexAlign.Center).width("100%").margin({top: 8,bottom: 8})
}
// 按值传递
@Builder
export function Btn2(btnName: string){
  Row() {
    Button(btnName).width(200).padding({left: 20, right: 20})
  }.justifyContent(FlexAlign.Center).width("100%").margin({top: 8,bottom: 8})
}

接下来在需要的页面导入:

// BuilderTest.ets
import {Btn1, Btn2} from "./CommonBtn"
@Entry
@Component
struct Test {
  @State btnText1: string = "引用传递按钮文字"
  @State btnText2: string = "值传递按钮文字"
  build() {
    Column() {
      // 引用传递
      Row() {
        Btn1({btnName:this.btnText1})
      }
      // 值传递
      Row() {
        Btn2(this.btnText2)
      }
      // 测试按引用传递参数 和 值传递参数的区别
      Button("改变两个按钮的文字").onClick(e => {
        this.btnText1 += 1
        this.btnText2 += 1
      })
    }
  }
}

页面样式如下:

二、引用传递和值传递区别

按引用传递参数的时候,自定义构建函数中的变量会实时更新
官方文档:按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。

按值传递的时候,自定义构建函数中的变量不会更新
官方文档:
调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递

测试:

当点击【改变两个按钮的文字】时,只有按引用传递的参数 实时更新了:

### HarmonyOS ArkTS 基础语法与实例 #### 类型定义 ArkTS继承了TypeScript的强大类型系统,在变量声明时需指定其数据类型,这有助于编译器提前发现潜在错误并优化执行效率。例如: ```typescript let message: string = "Hello, world!"; ``` 对于复杂的数据结构如对象字面量,当遇到`Object literals cannot be used as type declarations`这样的错误提示时[^3],可以通过重构代码来绕开此限制。一种方法是先创建接口或类型别名再基于它们构建具体的对象。 #### 函数声明 函数参数同样支持详细的类型标注,返回值也可以被显式说明。下面是一个简单的例子展示如何定义带参函数以及使用箭头表达式的简洁写法: ```typescript function greet(name: string): void { console.log(`Hello ${name}`); } const add = (a: number, b: number): number => a + b; ``` 针对特定场景下的装饰器模式(Decorator),比如用于UI组件的构造,可以采用如下方式处理: ```typescript @Builder class MyComponent extends Component { constructor(props?: Props) { super(); // Initialization code here... } } ``` 需要注意的是,如果某些情况下确实存在无法满足严格类型的状况,并且开发者已经验证这些部分逻辑无误,则可考虑利用`// @ts-ignore`指令暂时忽略该处警告,不过这种做法应谨慎对待以维护整体代码质量[^2]。 #### 接口与类 为了增强模块化编程能力,ArkTS允许用户自定义接口和抽象基类作为其他实体遵循的标准模板。这里给出一段关于界面布局管理的小片段: ```typescript interface LayoutProps { width: number; height: number; } abstract class BaseLayout implements LayoutProps { protected _width: number; protected _height: number; public setDimensions(width: number, height: number): void { this._width = width; this._height = height; } abstract render(): Element; // Must implement in derived classes. } ``` 以上就是一些基础概念介绍及其应用案例,希望可以帮助到正在学习HarmonyOS应用程序开发的朋友。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值