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刷新。所以当使用状态变量的时候,推荐使用按引用传递

测试:

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

<think>好的,用户之前问了关于ArkTS中Checkbox组件没有.checked属性的问题,现在又转向询问如何编写函数。我需要确定用户的学习阶段,可能是在学习ArkTS的基础知识,或者在开发过程中遇到了函数编写的问题。 首先,用户可能已经掌握了组件的基本使用,现在想进一步了解如何组织代码,特别是函数的使用。ArkTS作为TypeScript的超集,函数编写应该和TS类似,但可能有框架特定的注意事项,比如装饰器或者状态管理。 接下来,我需要考虑用户的具体需求。编写函数可能涉及普通函数、成员方法、异步函数、事件处理函数等。用户可能想知道如何正确声明和使用这些函数,特别是在ArkUI的组件结构中如何绑定事件处理函数,以及如何管理状态。 另外,用户可能在开发中遇到函数作用域、this指向、参数传递等问题,或者需要了解如何通过函数实现组件间的交互。需要覆盖基本语法、常见用法和最佳实践,同时提供示例代码帮助理解。 还要注意ArkTS的特殊之处,比如@Extend装饰器用于扩展函数,或者@Builder用于自定义布局函数。用户可能对这部分内容感兴趣,尤其是在构建复杂UI时如何使用这些装饰器。 需要确保回答结构清晰,分步骤介绍不同类型的函数,并提供代码示例,避免使用用户不熟悉的术语,同时强调与TypeScript的不同之处。可能还需要提醒常见错误,比如作用域问题或装饰器的错误使用,帮助用户避免常见陷阱。 最后,总结最佳实践,帮助用户巩固知识点,并推荐官方文档供进一步学习。确保回答准确且易于理解,符合用户的学习路径和实际开发需求。</think>在ArkTS中编写函数需要遵循TypeScript语法规范,并结合ArkUI框架特性。以下是关键知识点和示例说明: --- ### **一、函数基础语法** #### 1. **普通函数声明** ```typescript // 无参数无返回值 function sayHello(): void { console.log("Hello ArkTS!") } // 带参数和返回值的函数 function add(x: number, y: number): number { return x + y } ``` #### 2. **箭头函数** ```typescript // 单行简写形式 const square = (n: number) => n * n // 多行代码块 const checkEven = (num: number): boolean => { if (num % 2 === 0) { return true } return false } ``` --- ### **二、组件内函数编写** #### 1. **成员方法** (使用`function`关键字) ```typescript @Entry @Component struct MyComponent { // 类成员变量 private counter: number = 0 // ✅ 标准成员方法 private increment(): void { this.counter++ } build() { Button('点击+1') .onClick(() => { this.increment() // 调用成员方法 }) } } ``` #### 2. **事件处理函数** ```typescript @Entry @Component struct EventDemo { @State text: string = "初始文本" // 自定义事件处理函数 private handlePress(): void { this.text = "按钮被长按" } build() { Column() { Text(this.text) Button("长按触发") .onLongPress(() => this.handlePress()) // 绑定长按事件 } } } ``` --- ### **三、特殊函数类型** #### 1. **异步函数** (`async/await`) ```typescript async function fetchData(url: string): Promise<void> { try { let response = await http.get(url) console.log("数据获取成功:", response.data) } catch (error) { console.error("请求失败:", error) } } ``` #### 2. **生成器函数** (`function*`) ```typescript function* idGenerator(): Generator<number> { let id = 1 while(true) { yield id++ } } // 使用示例 const gen = idGenerator() console.log(gen.next().value) // 输出1 console.log(gen.next().value) // 输出2 ``` --- ### **四、ArkUI框架特有函数** #### 1. **@Builder装饰函数** (构建UI片段) ```typescript @Entry @Component struct BuilderExample { @Builder specialText(content: string) { Text(content) .fontColor(Color.Red) .fontSize(20) } build() { Column() { this.specialText("自定义样式文本") // 复用Builder } } } ``` #### 2. **@Extend装饰函数** (扩展样式) ```typescript // ✅ 正确扩展函数 @Extend(Text) function boldText() { .fontWeight(FontWeight.Bold) .fontColor("#333") } // 使用示例 Text("加粗文本") .boldText() // 应用扩展样式 ``` --- ### **五、最佳实践建议** 1. **类型严格化** ```typescript // ✅ 推荐:明确参数和返回值类型 function calculate(a: number, b: number): number { return a * b } // ❌ 避免:使用any类型 function unsafeAdd(a: any, b: any): any { return a + b } ``` 2. **状态管理函数** ```typescript @Entry @Component struct StateDemo { @State count: number = 0 // ✅ 推荐:通过方法修改状态 private resetCounter(): void { this.count = 0 } build() { Column() { Text(`计数: ${this.count}`) Button("重置").onClick(() => this.resetCounter()) } } } ``` --- ### **六、常见问题排查** | 问题场景 | 解决方案 | |---------|----------| | **`this`作用域丢失** | 使用箭头函数或`.bind(this)`绑定上下文 | | **异步更新UI失败** | 确保状态变量使用`@State`装饰器 | | **参数类型错误** | 启用严格类型检查 (`strict: true` in tsconfig.json) | | **函数未定义** | 检查函数作用域和导入/导出语句 | --- ### **七、调试技巧** 1. **函数追踪**: ```typescript function complexCalc(input: number): number { console.log("[DEBUG] 输入参数:", input) // 添加调试日志 // ...计算逻辑... } ``` 2. **性能分析**: ```typescript // 使用console.time进行性能测试 function heavyTask() { console.time("耗时任务") // ...复杂计算... console.timeEnd("耗时任务") } ``` --- 通过合理使用这些函数编写方式,可以构建出高效、可维护的ArkTS应用。建议结合[ArkTS官方文档](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/arkts-basic-syntax-0000001774120006)进行深入学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值