当前位置: 首页 > news >正文

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

在鸿蒙应用开发(基于ArkTS)中,使用 struct 封装共用模块主要涉及可复用UI组件逻辑模块化两种场景。以下是详细解决方案:


一、UI组件封装(使用 struct

通过 @Component 装饰器创建可复用的UI组件,适用于按钮、卡片等可视化元素。

示例:封装通用按钮组件
// 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
  }
}
调用方式
// 使用组件
import { CommonButton } from'../components/CommonButton'

@Entry
@Component
struct HomePage {
  build() {
    Column() {
      CommonButton()
        .setText('立即登录')
        .setOnClick(() => {
          console.log('按钮被点击')
        })
    }
  }
}

二、逻辑模块封装(非UI)

对于工具类、服务层等非UI逻辑,使用 ES模块化 进行封装。

示例:网络请求工具类
// 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)
    })
  }
}
调用方式
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 实现全局状态管理:

// 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 实现插槽功能:

@Component
struct CardContainer {
@BuilderParam content: () =>void

  build() {
    Column() {
      this.content()
    }
    .padding(20)
    .backgroundColor(Color.White)
    .borderRadius(8)
  }
}

// 使用
CardContainer({
  content: () => {
    Text('自定义内容').fontSize(16)
  }
})

四、项目结构建议

src/
├── components/      // 公共组件
├── utils/           // 工具类
├── services/        // 业务服务
├── models/          // 数据模型
├── resources/       // 静态资源
└── pages/           // 页面目录

关键点总结

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

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

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

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

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

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

deb24ab96d09ae90e6009d62fa31a63b.jpeg

913b79242713eac4496e044d9774063e.jpeg

相关文章:

  • 小蓝相机HDR拍照流程分析
  • SSM-Spring篇1——SpringIoC
  • 总结:如何在SpringBoot中使用https协议以及自签证书?
  • DeepSeek模型架构及优化内容
  • C++ 标准库常见容器
  • Kotlin 2.1.0 入门教程(十六)属性、getter、setter、幕后字段、后备属性、编译时常量、延迟初始化
  • 【网络法医】恶意软件分析
  • 国内外网络安全政策动态(2025年1月)
  • mysql中general_log日志详解
  • mysql索引为什么用B+树,不用二叉树
  • Spring系统学习——持续更新
  • MySQL的备份与还原
  • 项目BUG
  • 股指期货有什么常见的交易方式?
  • ChatGPT macOS 桌面应用让你的编程体验更上一层楼
  • AI问答-供应链管理-M2:战略分析模型汇总
  • spring boot单元测试
  • LeetCode刷题第7题【整数反转】---解题思路及源码注释
  • 网络基础 【UDP、TCP】
  • 什么是耐环境环形光源
  • 百度收录网站排名/新媒体营销六种方式
  • 屏边县住房和城乡建设局网站/百度广告公司
  • 做网站需要备案吗/口碑营销方案怎么写
  • 2017山亭区建设局网站/软文投稿平台有哪些
  • 手机娱乐网站制作/google chrome官网入口
  • crm系统的销售管理功能包括/西安seo优化培训