介绍
@Component 是一个核心的 装饰器(Decorator),用于将一个 struct 标记为一个可复用的 自定义UI组件。
通过 封装 UI逻辑、状态管理 和 事件处理,实现了模块化组件开发
作用
声明自定义组件:
@Component告诉 ArkTS 框架,这个struct不是一个简单的数据结构,而是一个可以被其他组件引用和复用的 UI 组件。启用组件能力:被
@Component装饰的struct可以使用@State、@Prop、@Link等状态管理装饰器,并拥有自己的build()方法来定义 UI。实现代码复用与模块化:通过将 UI 片段封装成
@Component,可以在多个地方重复使用,避免代码冗余,提高开发效率和可维护性。生命周期集成:与ArkUI的生命周期(如
aboutToAppear、aboutToDisappear)无缝结合,支持组件级生命周期管理。
应用场景
封装 UI 片段:
将常用的 UI 结构(如带图标和标题的导航栏、用户信息卡片)封装成@Component,在多个页面中复用。列表项组件:
在List组件中,每一行的展示内容通常会封装成一个独立的@Component,通过@Prop接收数据。复杂表单的模块化:
将表单拆分为多个@Component(如输入框组、选择器组),使代码更清晰。状态隔离:
每个@Component拥有独立的状态管理(通过@State),避免状态混乱。
使用方法
定义组件
@Component 装饰器直接放在 struct 定义之前。
@Component
struct MyComponent {
// 属性定义
@State title: string = 'Default Title';
// 构建UI
build() {
Column() {
Text(this.title).fontSize(20)
Button('Change Title').onClick(() => {
this.title = 'Updated Title';
})
}
}
}
关键点:
@Component用于封装页面内的子组件(如卡片、列表项、按钮等)。@State:标记响应式状态,修改时自动触发UI刷新。build():必须实现的方法,返回组件的UI结构(如Column、Row等容器)。
使用组件
@Entry
@Component
struct MainPage {
build() {
Column() {
MyComponent() // 复用MyComponent
Text('Main Page Content')
}
}
}
生命周期方法
@Component
struct LifecycleComponent {
aboutToAppear() {
console.log('组件即将显示');
}
aboutToDisappear() {
console.log('组件即将隐藏');
}
build() { /* ... */ }
}
注意事项
- 命名规范:组件名使用大驼峰命名法(PascalCase),如
UserCard,HeaderBar。 - 单一职责:一个
@Component应该只负责一个明确的功能或 UI 区块,保持其简洁。 - 通过
@Prop传递数据:子组件的数据应通过@Prop从父组件传递,避免直接访问外部状态。 - 避免过度嵌套:虽然可以嵌套组件,但过深的嵌套会影响性能和可读性。
- 与
@Builder配合:对于组件内部复杂的 UI 片段,可以使用@Builder装饰器定义可复用的 UI 生成函数,进一步提升组件内部的可读性。
总结
@Component 是鸿蒙开发中实现 组件化 和 模块化 的核心工具。它允许开发者将 UI 拆分为一个个独立、可复用的单元,极大地提升了代码的组织性和开发效率。