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