鸿蒙开发笔记-3-自定义组件基础

49 阅读1分钟

一、组件架构设计原理

1.1 组件化核心机制

HarmonyOS自定义组件基于ArkUI框架构建,采用声明式UI编程模型,通过@Component装饰器实现组件封装。其核心特性包括:

  • 原子化设计:每个组件独立管理状态与样式
  • 响应式更新:通过@State/@Prop等装饰器实现数据驱动UI
  • 跨设备适配:支持一次开发多端部署的弹性布局

1.2 组件生命周期全解析

页面级生命周期(@Entry组件):

@Component
struct PageComponent {
  onPageShow() { /* 页面显示时触发 */ }
  onPageHide() { /* 页面隐藏时触发 */ }
  onBackPress() { /* 物理返回键处理 */ }
}

组件级生命周期:

@Component
struct MyComponent {
  aboutToAppear() { /* 组件实例化后执行 */ }
  onDidBuild() { /* UI构建完成后触发 */ }
  aboutToDisappear() { /* 组件销毁前执行 */ }
}

生命周期管理最佳实践:

  • 避免在aboutToDisappear中修改状态变量
  • 使用onDidBuild进行埋点数据上报
  • 页面切换时冻结非活跃组件

二、组件通信模式进阶

2.1 数据传递模式对比

方式数据流向适用场景性能影响
@Prop父→子单向简单参数传递
@Link双向绑定表单控件交互
@Provide/@Consume跨层级传递主题切换/全局配置
EventEmitter子→父事件复杂交互场景

2.2 动态参数处理

使用@Builder构建可复用UI片段:

@Builder
function DynamicHeader(title: string) {
  Row() {
    Text(title).fontSize(18)
    Image($r('app.media.icon'))
  }
}

@Component
struct ProfilePage {
  build() {
    Column() {
      DynamicHeader("用户资料")
    }
  }
}

三、高级布局与交互实现

3.1 自定义布局引擎

重写布局方法实现瀑布流效果:

@Component
struct WaterfallLayout {
  onMeasureSize() {
    // 计算子组件尺寸
    children.forEach(child => {
      child.measure({ width: 100, height: 150 })
    })
  }

  onPlaceChildren() {
    // 动态排列子组件位置
    let x = 0, y = 0
    children.forEach((child, index) => {
      child.place({ x, y })
      y += (index % 2 === 0) ? 160 : 120
    })
  }
}

3.2 复杂交互组件开发

实现可拖拽排序列表:

@Component
struct DraggableList {
  @State items: string[] = ['Item1', 'Item2', 'Item3']
  
  build() {
    List() {
      ForEach(this.items, (item, index) => {
        ListItem() {
          Text(item)
            .gesture(
              PanGesture()
                .onActionUpdate((event) => {
                  // 处理拖拽逻辑
                })
            )
        }
      })
    }
  }
}

四、性能优化体系

4.1 渲染优化策略

  • 节点精简:使用@Reusable实现组件复用
  • 懒加载:LazyForEach处理长列表
  • 状态冻结:freezeWhenInactive控制非活跃组件

4.2 内存管理技巧

优化手段实现方式适用场景
对象池技术复用组件实例高频创建/销毁场景
图片压缩使用WebP格式+分辨率适配图片密集型应用
大数据分页分页加载+滚动缓存列表展示场景

五、企业级开发实践

5.1 导航栏组件封装

实现多形态导航栏:

@Component
struct CustomNavBar {
  @Prop title: string
  @Prop showBack: boolean = true
  
  build() {
    Row() {
      if (this.showBack) {
        Image($r('app.media.back'))
          .onClick(() => zrouter.pop())
      }
      Text(this.title).flexGrow(1)
    }
    .padding(10)
    .backgroundColor(Color.White)
  }
}

5.2 日历组件开发

集成日程管理功能:

@Component
struct Calendar {
  @State selectedDate: Date = new Date()
  @Prop events: EventData[]
  
  build() {
    Grid() {
      ForEach(this.generateDays(), (day) => {
        GridItem() {
          Text(day.date)
            .backgroundColor(this.getDayColor(day))
            .onClick(() => this.selectDate(day))
        }
      })
    }
  }
  
  private getDayColor(day: DayInfo): Color {
    return this.events.some(e => e.date === day.date) ? Color.Red : Color.White
  }
}

我是今阳,如果想要进阶和了解更多的干货,欢迎关注微信公众号 “今阳说” 接收我的最新文章