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

在鸿蒙应用开发(基于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/           // 页面目录

关键点总结

  1. UI组件 :使用 @Component + struct 封装带视图的模块

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

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

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

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

关注我获取更多知识或者投稿

相关推荐
积水成渊,蛟龙生焉4 小时前
鸿蒙装饰器V2详解
华为·harmonyos·arkts·鸿蒙·ark
zuowei28894 小时前
华为网络设备配置文件备份与恢复(上传、下载、导出,导入)
开发语言·华为·php
C雨后彩虹8 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
代码飞一会儿9 小时前
Harmony OS开发之沉浸式模式设计学习
harmonyos·敏捷开发
liulian091611 小时前
Flutter 三方库 flutter_local_auth 的鸿蒙化适配指南
flutter·华为·学习方法·harmonyos
SuperHeroWu711 小时前
【鸿蒙基础入门】概念理解和学习方法论说明
前端·学习·华为·开源·harmonyos·鸿蒙·移动端
亘元有量-流量变现11 小时前
抓住鸿蒙流量红利!2026华为应用商店ASO优化全解
华为·harmonyos·aso优化
特立独行的猫a12 小时前
使用 vcpkg 为OpenHarmony(鸿蒙PC)构建 OpenSSH 命令行工具
harmonyos·openharmony·命令行·openssh·vcpkg·鸿蒙pc
音视频牛哥12 小时前
纯血鸿蒙(HarmonyOS NEXT)下,如何实现低延迟RTSP、RTMP播放器音视频解码?
华为·音视频·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·harmonyos rtsp·鸿蒙next播放器
特立独行的猫a13 小时前
OpenSSH 介绍及使用Lycium框架移植到鸿蒙 PC(OpenHarmony)平台的实践总结
harmonyos·openssh·鸿蒙pc·lycium_plusplus·三分库移植