在鸿蒙应用开发(基于ArkTS)中,使用 struct
封装共用模块主要涉及可复用UI组件 和逻辑模块化两种场景。以下是详细解决方案:
一、UI组件封装(使用 struct
)
通过 @Component
装饰器创建可复用的UI组件,适用于按钮、卡片等可视化元素。
示例:封装通用按钮组件
go
// components/CommonButton.ets
@Component
export struct CommonButton {
private btnText: string = '默认按钮'
private onTap: () =>void = () => {}
build() {
Button(this.btnText)
.width(120)
.height(40)
.backgroundColor(Color.Blue)
.onClick(() => {
this.onTap()
})
}
// 设置按钮文字
public setText(value: string): CommonButton {
this.btnText = value
returnthis
}
// 设置点击事件
public setOnClick(action: () =>void): CommonButton {
this.onTap = action
returnthis
}
}
调用方式
go
// 使用组件
import { CommonButton } from'../components/CommonButton'
@Entry
@Component
struct HomePage {
build() {
Column() {
CommonButton()
.setText('立即登录')
.setOnClick(() => {
console.log('按钮被点击')
})
}
}
}
二、逻辑模块封装(非UI)
对于工具类、服务层等非UI逻辑,使用 ES模块化 进行封装。
示例:网络请求工具类
go
// utils/http.ets
import { HttpRequestOptions, HttpResponse } from'@ohos.net.http'
exportclass HttpUtil {
staticasyncget(url: string): Promise<HttpResponse> {
let http = http.createHttp()
returnawait http.request(url, {
method: http.RequestMethod.GET
})
}
staticasync post(url: string, data: object): Promise<HttpResponse> {
let http = http.createHttp()
returnawait http.request(url, {
method: http.RequestMethod.POST,
header: { 'Content-Type': 'application/json' },
extraData: JSON.stringify(data)
})
}
}
调用方式
go
import { HttpUtil } from '../utils/http'
async fetchData() {
try {
let response = await HttpUtil.get('https://api.example.com/data')
console.log('响应数据:', response.result)
} catch (error) {
console.error('请求失败:', error)
}
}
三、进阶技巧
1. 状态共享
使用 AppStorage
实现全局状态管理:
go
// stores/userStore.ets
import { AppStorage } from'@ohos.application'
AppStorage.SetOrCreate<string>('username', 'Guest')
exportfunction getUserName(): string {
return AppStorage.Get<string>('username')
}
exportfunction setUserName(name: string): void {
AppStorage.Set<string>('username', name)
}
2. 组件插槽
通过 @BuilderParam
实现插槽功能:
go
@Component
struct CardContainer {
@BuilderParam content: () =>void
build() {
Column() {
this.content()
}
.padding(20)
.backgroundColor(Color.White)
.borderRadius(8)
}
}
// 使用
CardContainer({
content: () => {
Text('自定义内容').fontSize(16)
}
})
四、项目结构建议
go
src/
├── components/ // 公共组件
├── utils/ // 工具类
├── services/ // 业务服务
├── models/ // 数据模型
├── resources/ // 静态资源
└── pages/ // 页面目录
关键点总结
-
UI组件 :使用
@Component
+struct
封装带视图的模块 -
逻辑模块:通过类/函数 + ES Module 导出
-
状态管理 :结合
AppStorage
或自有状态管理方案 -
类型安全:推荐使用TypeScript增强代码健壮性
根据实际场景选择封装方式,平衡复用性与灵活性。对于高频使用的功能模块,建议通过抽象接口实现更松散的耦合。
关注我获取更多知识或者投稿

