鸿蒙next开发-struct如何封装共用模块

在鸿蒙应用开发(基于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/           // 页面目录关键点总结
  1. UI组件 :使用 @Component + struct 封装带视图的模块

  2. 逻辑模块:通过类/函数 + ES Module 导出

  3. 状态管理 :结合 AppStorage 或自有状态管理方案

  4. 类型安全:推荐使用TypeScript增强代码健壮性

根据实际场景选择封装方式,平衡复用性与灵活性。对于高频使用的功能模块,建议通过抽象接口实现更松散的耦合。

相关推荐
kyriewen115 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
木斯佳7 小时前
HarmonyOS 6 三方SDK对接:从半接模式看Share Kit原理——系统分享的运行机制与设计理念
设计模式·harmonyos·架构设计·分享·半接模式
被温水煮的青蛙8 小时前
HarmonyOS openCustomDialog 实战:从入门到理解原理
harmonyos
高一学习c++会秃头吗8 小时前
鸿蒙适应式布局和响应式布局零基础
harmonyos
HwJack209 小时前
HarmonyOS应用开发中EmbeddedUIExtensionAbility:跨进程 UI 嵌入的“幕后导演“
ui·华为·harmonyos
早點睡39011 小时前
ReactNative项目鸿蒙化三方库集成实战:react-native-calendars(日历展开和日程模块存在兼容性问题)
react native·react.js·harmonyos
zhensherlock13 小时前
Protocol Launcher 系列:Microsoft Edge 浏览器唤起的优雅方案
javascript·chrome·microsoft·typescript·edge·github·edge浏览器
紫_龙14 小时前
最新版vue3+TypeScript开发入门到实战教程之生命周期函数
前端·javascript·typescript
云和数据.ChenGuang14 小时前
鸿蒙 + ChromaDB:端侧向量检索,打造全场景智能应用新范式
华为·harmonyos·鸿蒙
前端不太难15 小时前
AI + 鸿蒙游戏,会不会是下一个爆点?
人工智能·游戏·harmonyos